【发布时间】:2026-01-09 07:30:01
【问题描述】:
我用一些使用类别的便捷方法扩展了 NSString 和 NSMutableString。这些添加的方法具有相同的名称,但具有不同的实现。例如,我已经实现了 ruby 的“strip”函数,该函数删除了端点处的空格字符,但对于 NSString,它返回一个新字符串,对于 NSMutableString,它使用“deleteCharactersInRange”剥离现有字符串并返回它(如红宝石带!)。
这是典型的标题:
@interface NSString (Extensions)
-(NSString *)strip;
@end
和
@interface NSMutableString (Extensions)
-(void)strip;
@end
问题是当我声明 NSString *s 并运行 [s strip] 时,它会尝试运行 NSMutableString 版本并引发扩展。
NSString *s = @" This is a simple string ";
NSLog([s strip]);
失败:
由于未捕获而终止应用 例外 'NSInvalidArgumentException',原因: '尝试改变不可变对象 使用 deleteCharactersInRange:'
【问题讨论】:
-
除非 S 的值是固定的,否则你永远不应该做类似 NSLog([s strip]) 的事情。如果 s 的值为 @"%@",它会崩溃。通常不值得考虑是否固定了 s 的域,而是应该养成这样做的习惯: NSLog(@"%@", [s strip]);
标签: iphone cocoa cocoa-touch nsmutablestring