这两个工作,但是,哪一个将使用和为什么?

@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。我想,因为第一选项保存一行代码,我会用那一个。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top