1. copy 返回的是不可变对象(immutableObject),即便原消息接收者是mutable对象,copy返回的也将是不可变对象(immutableObject)。
2. mutableCopy 返回的是可变对象(mutableObject)
例1:
NSString* string =[NSString stringWithString:@"This is Copy Demo."];
NSString* str1 = string; // 地址与string相同
NSString* str2 = [string copy]; // 地址与string相同,并没有真正开辟新的内存空间,与强引用相同
NSString* str3 = [string mutableCopy]; // 地址与string不同,开辟新的内存空间存储字符串,返回类型是MutableString
例2:
CopyTest* testObj = [CopyTestnew];
NSMutableString* mstrTest = [NSMutableString stringWithString:@"Test Mutable String"];
NSArray* array =@[@"String",@{@"Key":@"Value"},@(3), mstrTest];
NSMutableArray* mutableArray = [NSMutableArrayarrayWithArray:array];
testObj.marrInstanceCopy = mutableArray;
// 因为属性定义为(nonatomic, copy)所以会自动copy,但返回值是不可变对象所以这里进行改变对象值的操作(addObject:)会崩溃。(指针所指向对象的类型是__NSArrayI)
[testObj.marrInstanceCopy addObject:@"Add Object"];
网友评论