1

两者都有效,但你会使用哪一个,为什么?

@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
4

3 回答 3

4

选项 #2。

NSString 旨在成为一个不可变对象。NSString 上的所有标准“stringBy”方法都返回新的自动发布的 NSString。

虽然 #1 也最终返回了一个新的 NSString,但它充其量在语义上是不正确的,最坏的情况是改变了应该是不可变对象的引用对象。

于 2010-01-10T02:44:19.153 回答
4

首先,您的 Objective-C 方法定义完全等同于这个 C 函数:

NSString* stringByTrimmingPrefix(NSString* self, SEL _cmd, NSString* strPrefix)
{
    ...
}

如您所见,self只是另一个函数参数;您可以将它重新分配给您想要的任何东西,它不会影响它最初指向的原始 NSString* 实例的状态。

因此,在这方面,您在第一次实施中所做的事情并没有错。

但是,您的两个实现都不是非常有效,并且都有错误(如果您传递带有多个字符的前缀会发生什么?)

我会使用rangeOfString:options:range:来查找您的前缀,这样您最多只能创建一个额外的 NSString 实例。

请参阅搜索、比较和排序字符串

于 2010-01-10T03:41:26.000 回答
0

所以这只是从字符串前面切掉一个字母(如果那个字母不止一次,它会切掉尽可能多的字母)?

由于 NSString 是不可变的,因此无论哪种方式,性能方面我都没有区别。在第一种情况下,您每次都将 self 替换为一个新的字符串对象,而在第二种情况下,您每次都将 returnValue 替换为一个新的字符串对象。我想因为第一个选项保存了一行代码,所以我会使用那个。

于 2010-01-10T02:37:59.983 回答