关于OC中的copy、mutableCopy看过别人写的很多文章,平时工作中也经常用,但并没有验证过,今天来验证下。
1、NSString: Copy、mutableCopy
通过控制台打印的信息,可以看出:copy后的地址与原地址是同一个地址,类型也是同一种类型__NSCFConstantString,是浅拷贝。mutableCopy后的地址与原地址不是同一个,类型为__NSCFString,与原类型__NSCFConstantString不一样,是深拷贝。
2、NSMutableString: Copy、mutableCopy
NSMutableString copy、mutableCopy后的地址与原地址均不同,均为深拷贝。copy后的类型为__NSCFConstantString,不可变字符串,mutableCopy后的类型与原类型均为__NSCFString,是可变字符串。
3、NSArray:Copy、mutableCopy
NSArray copy后的地址与原地址是同一个地址,类型也是同一种类型__NSArray0,是浅拷贝。mutableCopy后的地址与原地址不是同一个,类型为__NSArrayM,与原类型__NSArray0不一样,是深拷贝。
4、NSMutableArray:Copy、mutableCopy
NSMutableArray copy、mutableCopy后的地址与原地址均不同,均为深拷贝。copy后的类型为__NSArray0,是不可变数组。mutableCopy后的类型与原类型均为__NSArrayM,均为可变数组。
5、NSDictionary:Copy、mutableCopy
NSDictionary copy后的地址与原地址是同一个地址,类型也是同一种类型__NSDictionary0,是浅拷贝。mutableCopy后的地址与原地址不是同一个,类型为__NSDictionaryM,与原类型__NSDictionary0,也不一样,是深拷贝。
6、NSMutableDictionary:Copy、mutableCopy
NSMutableDictionary copy、mutableCopy后的地址与原地址均不同,均为深拷贝。copy后的类型为__NSFrozenDictionaryM,不可变字典,mutableCopy后的类型与原类型均为__NSDictionaryM,均为可变字典。
结论:
1、不可变对象:copy,是浅拷贝;mutableCopy,是深拷贝,生成的对象是可变的。
2、可变对象: copy,是深拷贝,生成的对象是不可变的;mutableCopy,是深拷贝,生成的对象是可变的。
详见Demo