gpt4 book ai didi

objective-c - -copy 什么时候返回可变对象?

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

我读入了Cocoa and Objective C: Up and Running -copy 将始终返回一个不可变对象(immutable对象),而 -mutableCopy 将始终返回一个可变对象:

It’s important to know that calling -copy on a mutable object returns an immutable version. If you want to copy a mutable object and maintain mutability in the new version, you must call -mutableCopy on the original. This is useful, though, because if you want to “freeze” a mutable object, you can just call -copy on it.

所以我有这样的东西:

NSMutableURLRequest *req = [[NSMutableURLRequest alloc] init];
NSLog( @"%@", [req className] ); // NSMutableURLRequest
NSLog( @"%@", [[req copy] className] ); // NSMutableURLRequest
NSLog( @"%@", [[req mutableCopy] className] ); // NSMutableURLRequest

根据这个previous answer :

You cannot depend on the result of copy to be mutable! Copying an NSMutableArray may return an NSMutableArray, since that's the original class, but copying any arbitrary NSArray instance would not.

这似乎与 NSURLRequest 有点隔离,因为 NSArray 按预期运行:

NSArray *arr = [[NSMutableArray alloc] init];
NSLog( @"%@", [arr className] ); // __NSArrayM
NSLog( @"%@", [[arr copy] className] ); // __NSAraryI
NSLog( @"%@", [[array mutableCopy] className] ); // __NSArrayM

所以...

  1. -copy 什么时候返回一个不可变对象(immutable对象)(如预期的那样),什么时候返回一个可变对象?
  2. 如何实现获取拒绝“卡住”的可变对象的“卡住”副本的预期效果?

最佳答案

我认为您发现了文档与现实之间的巨大差距。

NSCopying 协议(protocol)文档声称:

The copy returned is immutable if the consideration “immutable vs. mutable” applies to the receiving object; otherwise the exact nature of the copy is determined by the class.

但这在某些情况下显然是错误的,正如您在示例中所展示的那样(并且我已通过该文档页面向他们发送了有关此问题的反馈)。

但是(#2)在我看来,这实际上并不重要,您也不应该关心。

-copy 的要点是它将返回一个您可以使用的对象并保证它的行为独立于原始对象。这意味着如果您有一个可变对象,-复制它,并更改原始对象,复制将看不到效果。 (在某些情况下,我认为这意味着 -copy 可以优化为什么也不做,因为如果对象是不可变的,那么它一开始就无法更改。我对此可能是错误的。 (我现在想知道因此对字典键有什么影响,但这是一个单独的主题...))

如您所见,在某些情况下,新对象实际上可能属于可变类(即使文档告诉我们它不会)。但只要您不依赖它的可变性(您为什么要这样做?),就没有关系。

你应该怎么做? 始终将 -copy 的结果视为不可变的,就这么简单。

关于objective-c - -copy 什么时候返回可变对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7212268/

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