我在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返回一个不可变对象(如预期的那样),什么时候返回一个可变对象? - 如何获得拒绝“冻结”的可变对象的“冻结”副本的预期效果?