iOS 基础知识专题1 —— copy、mutableCopy
copy and mutableCopy
接下来会按照专题的方式,写一些 iOS 基础基础知识的文章,有些是从电脑里以前的笔记摘出来的。本片文章是关于copy、mutableCopy的总结。
先看以下几段代码:
-
对 NSString 做 copy、mutableCopy:
NSString *str1 = @"123"; NSString *copyStr1 = [str1 copy]; NSMutableString *mutableStr1 = [str1 mutableCopy]; NSLog(@"%p",str1); // 0x108159088 NSLog(@"%p",copyStr1); // 0x108159088 NSLog(@"%p",mutableStr1); // 0x60c00024d050
结论:对 NSString 做 copy 得到的对象地址不变,做mutableCopy,地址会变
-
对 MutableString 做 copy、mutableCopy:
// NSMutableString NSMutableString *str2 = [NSMutableString stringWithString:@"123"]; NSString *copyStr2 = [str2 copy]; NSMutableString *mutableStr2 = [str2 mutableCopy]; NSLog(@"%p",str2); // 0x60c000245670 NSLog(@"%p",copyStr2); // 0xa000000003332313 NSLog(@"%p",mutableStr2); // 0x60c000245940
结论:对 NSMutableString 做 copy、mutableCopy地址都会变。
-
对 NSArray 做 copy、mutableCopy:
// NSArray NSArray *array1 = [NSArray arrayWithObject:@"1"]; NSArray *copyArray1 = [array1 copy]; NSMutableArray *mutableCopyArray1 = [array1 mutableCopy]; NSLog(@"%p",array1); // 0x60c000015de0 NSLog(@"%p",copyArray1); // 0x60c000015de0 NSLog(@"%p",mutableCopyArray1); // 0x60c0000567a0
结论:对 NSArray 做 copy 得到的对象地址不变,做mutableCopy,地址会变,和String情况一样
-
对 NSMutableArray 做 copy、mutableCopy:
// NSMutableArray NSMutableArray *array2 = [NSMutableArray arrayWithObject:@"1"]; NSArray *copyArray2 = [array2 copy]; NSMutableArray *mutableCopyArray2 = [array2 mutableCopy]; NSLog(@"%p",array2); // 0x604000255390 NSLog(@"%p",copyArray2); // 0x60400001c2d0 NSLog(@"%p",mutableCopyArray2); // 0x604000255210
结论:对 NSMutableArray 做 copy、mutableCopy地址都会变。
总结一下:
- copy 返回不可变对象,对于“不可变对象“做 copy,地址不变。对于”可变对象“做 copy,地址改变(一定是两个不同对象,可变不可变能力都变了)。
- mutableCopy返回可变对象,无论对”可变对象“还是”不可变对象“,做 mutableCopy,地址都会改变。
- 也正说明了,为什么一个属性定义成copy的时候,比较安全,因为赋值的时候,相当于加上了
[XXX copy]
比如@property (nonatomic, copy) NSString *m_string;
所以如果赋值过来的是一个可变对象,也就是对可变对象做copy,会新生成一个对象赋值给 m_string,那么即使原本的可变对象改变了,也不影响 m_string 的变化。
X | copy | mutableCopy |
---|---|---|
可变对象 | 地址不变 | 地址改变 |
不可变对象 | 地址改变 | 地址改变 |