两者都有效,但你会使用哪一个?为什么?
@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
答案 0 :(得分:4)
选项#2。
NSString旨在成为不可变对象。 NSString上的所有标准“stringBy”方法都返回新的自动释放的NSStrings。
虽然#1也最终返回一个新的NSString,但它在语义上最好是不正确的,最坏的情况是改变被认为是不可变对象的引用对象。
答案 1 :(得分:4)
首先,您的Objective-C方法定义与此C函数完全等效:
NSString* stringByTrimmingPrefix(NSString* self, SEL _cmd, NSString* strPrefix)
{
...
}
如您所见,self
只是另一个函数参数;你可以将它重新分配给你想要的任何东西,它不会影响它最初指向的原始NSString *实例的状态。
在这方面,你在第一次实施中所做的事情没有任何问题。
但是,您的实现都不是非常有效,并且都有错误(如果您传递带有多个字符的前缀会发生什么?)
我会使用rangeOfString:options:range:来查找您的前缀,这样您最多只能创建一个额外的NSString实例。
答案 2 :(得分:0)
所以这只是从一个字符串的前面切掉一个字母(如果那个字母不止一次,它会切断尽可能多的字母)?
由于NSString是不可变的,我不会有任何区别,性能明智。在第一种情况下,每次都用一个新的字符串对象替换self,而在第二种情况下,每次都用一个新的字符串对象替换returnValue。我想因为第一个选项会保存一行代码,我将使用该代码。