NSString自修改类别困境

时间:2010-01-10 02:30:41

标签: iphone objective-c nsstring categories

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

@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

3 个答案:

答案 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实例。

请参阅Searching, Comparing, and Sorting Strings

答案 2 :(得分:0)

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

由于NSString是不可变的,我不会有任何区别,性能明智。在第一种情况下,每次都用一个新的字符串对象替换self,而在第二种情况下,每次都用一个新的字符串对象替换returnValue。我想因为第一个选项会保存一行代码,我将使用该代码。