gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 04:01:43 24 4
gpt4 key购买 nike

好的,所以我有一个方法将 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 做了像修改时复制这样的智能操作。但是第一个是返回调用者可以在理论上稍后去修改的东西。我不在乎他们是否这样做,因为字符串是他们的。但是,是否有正当理由更喜欢后一种形式而不是前一种形式?而且,stringWithStringstringValue 哪个更受青睐?

最佳答案

完全取决于您需要的防御程度。

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

因此,只要您信任您的客户,您也可以返回可变字符串(作为 NSString)。即使客户端做了一些愚蠢的事情并对其进行了修改,该死的编译器警告也不会中断。

确实重要的地方是当您返回某些不应在外部改变的对象的可变后备存储时。在这种情况下,客户端可能会忽略编译器警告和/或强制转换为可变变体,从而完全破坏您的对象。

或者,更巧妙地,客户端可能会获取对假定不可变返回类型的引用并持有它足够长的时间以致于稍后发生变异,从而使他们的引用处于令人惊讶的状态。

最佳实践:在计算和返回 transient 值时,可变性无关紧要。返回对内部可变存储的引用时,最好制作一个不可变副本。

关于objective-c - 我应该在返回 NSString 的方法中返回 NSMutableString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2934028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com