gpt4 book ai didi

objective-c - 在返回可变对象之前将可变对象转换为不可变对象(immutable对象)是否重要/好?

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

如果我使用一个方法来返回一个 NSArray,并且在该方法中我将结果构建为一个 NSMutableArray,我常常想用 return [NSArray arrayWithArray:myMutable] 代替的 return myMutable 只是为了锁定它并防止一些可能检查 isMemberOfClass 并进行一些突变的其他不正当代码的突变。

如果我只是为自己编写代码,并且我知道我会按照他们所说的那样对待返回值,那么在返回之前是否有任何理由将其切换为 NSArray?我在这里没有看到任何优势吗?

最佳答案

这样做并没有真正的好处;一般来说,您应该期望您的接口(interface)的客户端会遵守该接口(interface)的约定。

在许多基础值和容器类型(NSString 等)的情况下,它更不重要;由于免费桥接机制的实现细节,可变和不可变变体实际上是同一类的实例。例如,NSString 和 NSMutableString 的 init 方法实际上都返回一个 __NSCFString 的实例,它继承自两者。该对象保留了您调用的 API 的可变性或不变性,但您无法通过查看类来判断它是否可变。

换句话说,[aString isKindOfClass:[NSMutableString class]] 将始终返回 YES,无论您是否创建了可变对象。因此,使用该 API 来检查某些内容是否可变无论如何都行不通,因此不必担心您的 API 的客户端是否会尝试这样做。

编辑:我最初说你不能通过检查数组的类来判断它是否可变,但事实证明,在 NSArray 的情况下,你可以判断。 (感谢@albertamg 发现了错误。)我已经将上面的示例更改为使用 NSString,这是您确实无法分辨的情况。不过,总的来说,如果有人将您返回的对象视为可变对象,但它不是这样出售的,并且不会担心围绕它进行编程,我会认为这是一个错误。

再次编辑:所以事实证明,在某些版本的 OS X 和 iOS 中,您也无法检测到 NSArray 的可变性,但在更新的版本中,它们已经更改了实现,您可以。不过,您仍然无法在 NSString 中检测到它。那么,从所有这些中吸取的教训是,您不应该对属于 class cluster 的对象使用 isKindOfClass: .

关于objective-c - 在返回可变对象之前将可变对象转换为不可变对象(immutable对象)是否重要/好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6883526/

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