Objective c 我应该在返回NSString的方法中返回NSMutableString吗
好的,我有一个方法,它接受一个Objective c 我应该在返回NSString的方法中返回NSMutableString吗,objective-c,Objective C,好的,我有一个方法,它接受一个NSString作为输入,对这个字符串的内容进行操作,然后返回处理过的字符串。因此,宣言是: - (NSString *) processString: (NSString *) str; 问题是:我应该只返回我用作“工作”缓冲区的NSMutableString实例,还是应该在可变字符串周围创建一个新的NSString,然后返回该实例 因此,我应该这样做: - (NSString *) processString: (NSString *) str { N
NSString
作为输入,对这个字符串的内容进行操作,然后返回处理过的字符串。因此,宣言是:
- (NSString *) processString: (NSString *) str;
问题是:我应该只返回我用作“工作”缓冲区的NSMutableString
实例,还是应该在可变字符串周围创建一个新的NSString
,然后返回该实例
因此,我应该这样做:
- (NSString *) processString: (NSString *) str
{
NSMutableString *work = [NSMutableString stringWithString: str];
// process 'work'
return work;
}
或者这个:
- (NSString *) processString: (NSString *) str
{
NSMutableString *work = [NSMutableString stringWithString: str];
// process 'work'
return [NSString stringWithString: work]; // or [work stringValue]?
}
第二个复制了我返回的字符串的另一个副本,除非
NSString
做了一些聪明的事情,比如修改时复制。但是第一个是返回一些调用方可以在理论上稍后去修改的东西。我不在乎他们是否那样做,因为绳子是他们的。但是,有没有合理的理由选择后者而不是前者呢?而且,stringWithString
或stringValue
是否优于其他方法?完全取决于您需要的防御程度
您的代码的客户机无法合理地测试可变性。因此,客户机无法通过合理的方式从NSString
转换到NSMutableString
并突然实现字符串的编译器警告易变性
因此,只要您信任您的客户机,就可以返回可变字符串(作为NSString
)。即使客户机做了一些愚蠢的事情并对其进行了变异,编译器警告也会被诅咒,没有任何东西会被破坏
重要的是,当您返回某个对象的可变备份存储时,不应该在外部进行变异。在这种情况下,客户端可能会忽略编译器警告和/或强制转换到可变变量,并完全阻塞对象
或者,更微妙的是,客户机可能会抓取一个对假定不可变返回类型的引用,并将其保持足够长的时间,以使其在以后发生变异,从而使其引用处于令人惊讶的状态
最佳实践:当计算并返回瞬时值时,可变性是无关的。当返回对内部可变存储的引用时,最好创建一个不可变副本