我应该在返回NSString的方法中返回NSMutableString

Cas*_*all 4 objective-c

好的,所以我有一个方法,它接受一个NSString输入,对这个字符串的内容进行操作,并返回处理过的字符串.所以宣言是:

- (NSString *) processString: (NSString *) str;
Run Code Online (Sandbox Code Playgroud)

问题是:我应该只返回NSMutableString我用作"工作"缓冲区的实例,还是应该NSString在可变项周围创建一个新实例,并返回?

我应该这样做:

- (NSString *) processString: (NSString *) str
{
    NSMutableString *work = [NSMutableString stringWithString: str];
    // process 'work'
    return work;
}
Run Code Online (Sandbox Code Playgroud)

或这个:

- (NSString *) processString: (NSString *) str
{
    NSMutableString *work = [NSMutableString stringWithString: str];
    // process 'work'
    return [NSString stringWithString: work]; // or [work stringValue]?
}
Run Code Online (Sandbox Code Playgroud)

第二个是我要返回的字符串的另一个副本,除非NSString像copy-on-modify这样的智能事物.但第一个是返回调用者可以理所当然地稍后进行修改的东西.我不在乎他们是否这样做,因为弦是他们的.但是,是否有正当理由选择后一种形式而不是前者呢?而且,要么stringWithStringstringValue在其他首选?

bbu*_*bum 7

完全取决于你需要的防守程度.

您的代码的客户端没有合理的方法可以测试可变性.因此,没有合理的方法客户端可以从中NSString转换NSMutableString并突然实现字符串的无编译器警告可变性.

因此,只要您信任您的客户,您也可以返回可变字符串(作为NSString).即使客户端做了一些愚蠢的事情并且改变它,编译器警告也会被诅咒,没有任何破坏.

事情是,当你返回不应外部突变的一些对象的可变后备存储.在这种情况下,客户端可能会忽略编译器警告和/或转换为可变变量并完全bork您的对象.

或者,更巧妙的是,客户端可能会获取对所谓的不可变返回类型的引用,并保持足够长的时间以使其稍后发生变异,从而使其引用处于令人惊讶的状态.

最佳实践:在计算和返回瞬态值时,可变性无关紧要.返回对内部可变商店的引用时,最好制作不可变副本.