我在Cocoa and 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
根据上一个答案:
引用:
你不能依赖复制的结果是可变的!复制NSMutableArray
可能会返回NSMutableArray
,因为那是原始类,但复制任何任意的NSArray
实例都不会。
这似乎在NSURLRequest
中有些孤立,因为NSArray
的行为符合预期:
NSArray *arr = [[NSMutableArray alloc] init];
NSLog( @"%@", [arr className] ); // __NSArrayM
NSLog( @"%@", [[arr copy] className] ); // __NSAraryI
NSLog( @"%@", [[array mutableCopy] className] ); // __NSArrayM
所以...
-copy
何时返回一个不可变对象(如预期)以及何时返回一个可变对象?- 我如何实现获取可变对象的“冻结”副本并拒绝被“冻结”的预期效果?