NSString自我修改类别的困境
-
19-09-2019 - |
题
这两个工作,但是,哪一个将使用和为什么?
@implementation NSString (Extender)
-(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix
{
while ([self hasPrefix:strPrefix])
{
self = [self substringFromIndex:strPrefix.length];
}
return self;
}
@end
或
@implementation NSString (Extender)
-(NSString *) stringByTrimmingPrefix:(NSString *)strPrefix
{
NSString *returnValue = [NSString stringWithString:self];
while ([returnValue hasPrefix:strPrefix])
{
returnValue = [returnValue substringFromIndex:strPrefix.length];
}
return returnValue;
}
@end
解决方案
选项#2。
的NSString旨在是一个不可变的对象。所有标准上的NSString“stringBy”方法返回新的自动释放NSString的。
虽然#1也结束返回一个新的NSString,它是在最好语义上不正确,并在最坏的改变的什么被认为是一个不变的对象引用的对象。
其他提示
首先,你的目标-C的方法的定义是完全相当于这C功能:
NSString* stringByTrimmingPrefix(NSString* self, SEL _cmd, NSString* strPrefix)
{
...
}
正如你可以看到, self
只是另一种功能的参数;你可以重新分配到任何你想要的东西,它不会影响国家的原NSString*实例,它最初的指示。
所以没有错,你在做什么在你的第一次执行情况,在这方面的工作。
然而,既不是你的实现都是非常有效的,两者都有错误(发生什么,如果你通过前缀与多个角色?)
我会用 rangeOfString:选项:范围: 找到你的前缀,使得你只是创造最多的一个额外的NSString的实例。
看看 搜索、比较和分类的字符串
所以这只是扒断从字符串的前一个字母(如果该字母是有一次以上,多达有它会切断)?
由于NSString的是不可变的,我不是有区别的任何一种方式,性能明智的。在第一种情况下,你用一个新的字符串对象每次更换的自我,而在第二种情况下,你是一个新的String对象,每次更换的returnValue。我想,因为第一选项保存一行代码,我会用那一个。
不隶属于 StackOverflow