好的,所以我有一个方法,它接受一个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这样的智能事物.但第一个是返回调用者可以理所当然地稍后进行修改的东西.我不在乎他们是否这样做,因为弦是他们的.但是,是否有正当理由选择后一种形式而不是前者呢?而且,要么stringWithString或stringValue在其他首选?
完全取决于你需要的防守程度.
您的代码的客户端没有合理的方法可以测试可变性.因此,没有合理的方法客户端可以从中NSString转换NSMutableString并突然实现字符串的无编译器警告可变性.
因此,只要您信任您的客户,您也可以返回可变字符串(作为NSString).即使客户端做了一些愚蠢的事情并且改变它,编译器警告也会被诅咒,没有任何破坏.
凡做事情是,当你返回不应外部突变的一些对象的可变后备存储.在这种情况下,客户端可能会忽略编译器警告和/或转换为可变变量并完全bork您的对象.
或者,更巧妙的是,客户端可能会获取对所谓的不可变返回类型的引用,并保持足够长的时间以使其稍后发生变异,从而使其引用处于令人惊讶的状态.
最佳实践:在计算和返回瞬态值时,可变性无关紧要.返回对内部可变商店的引用时,最好制作不可变副本.
| 归档时间: |
|
| 查看次数: |
616 次 |
| 最近记录: |