我在Cocoa 和 Objective C: Up and Running中读到它-copy
总是返回一个不可变对象并且-mutableCopy
总是返回一个可变对象:
重要的是要知道调用
-copy
可变对象会返回不可变版本。如果要在新版本中复制可变对象并保持可变性,则必须调用-mutableCopy
原始对象。不过,这很有用,因为如果你想“冻结”一个可变对象,你可以调用-copy
它。
所以我有这样的事情:
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] init];
NSLog( @"%@", [req className] ); // NSMutableURLRequest
NSLog( @"%@", [[req copy] className] ); // NSMutableURLRequest
NSLog( @"%@", [[req mutableCopy] className] ); // NSMutableURLRequest
根据这个先前的答案:
您不能依赖复制的结果是可变的!复制 an
NSMutableArray
可能会返回 anNSMutableArray
,因为那是原始类,但复制任意NSArray
实例不会。
这似乎有点孤立于NSURLRequest
,因为NSArray
按预期行事:
NSArray *arr = [[NSMutableArray alloc] init];
NSLog( @"%@", [arr className] ); // __NSArrayM
NSLog( @"%@", [[arr copy] className] ); // __NSAraryI
NSLog( @"%@", [[array mutableCopy] className] ); // __NSArrayM
所以...
- 什么时候
-copy
返回一个不可变对象(如预期的那样),什么时候返回一个可变对象? - 如何获得拒绝“冻结”的可变对象的“冻结”副本的预期效果?