该文章属笔者原创, 未经允许, 禁止转载
OC中, 实现 NSCopying
和 NSMutableCopying
协议, 可以使用 copy
和 mutableCopy
方法
有这么一种说法, 简单的说明了
copy
和mutableCopy
的差别
-
copy
叫做浅拷贝
, 亦叫做指针拷贝
-
mutableCopy
叫做深拷贝
, 亦叫做值拷贝
常见的能够进行拷贝操作的对象有 NSString/NSArray/NSDictionary
用几句话总结:
-
copy
得到的是不可变对象 -
mutableCopy
得到的是可变对象 - 当
原对象
是不可变对象, 进行copy
操作, 得到的新对象也是不可变的, 所以完全没有必要再创建一个完全一样的新对象, 只需要拷贝指针, 让原对象
和新对象
都指向同一块内存地址就好 - 当
原对象
是不可变对象, 进行mutableCopy
操作, 得到的新对象是可变的, 这时候, 就需要创建一个新的对象, 并开辟一块新的内存空间, 这样才能保证就对象不可变, 新对象可变 - 当
原对象
是可变对象, 无论进行copy
还是mutableCopy
操作, 都会重新开辟内存你空间, 创建出一个完全新的对象
验证:
NSArray *array = @[@"1", @"2"];
NSArray *newArray = [array copy];
NSMutableArray *mutableArray = [array mutableCopy];
NSLog(@"%p %p %p", array, newArray, mutableArray);
NSMutableArray *mutableArray2 = [@[@"1", @"2"] mutableCopy];
NSArray *array2 = [mutableArray2 copy];
NSArray *newArray2 = [mutableArray2 mutableCopy];
NSLog(@"%p %p %p", mutableArray2, array2, newArray2);
输出结果:
用一张表来总结:
原对象 | copy | mutableCopy |
---|---|---|
不可变 | 指针拷贝 | 值拷贝 |
可变 | 值拷贝 | 值拷贝 |
显而易见, 并不是简单的 copy
就是 指针拷贝
, mutableCopy
就是 值拷贝
, 还要看原操作对象是否可变, 如果是不可变的, 那么是成立的, 当原操作对象是可变对象的时候, 无论进行什么操作, 那么结果就都是 值拷贝
注意
上述内容只针对正常情况, 因为像 NSString
等一些简单的类型, 系统采用一种叫做 Tagged Pointer
的技术, 会使结果在某些情况下有些许不一样. 了解 Tagged Pointer
相关内容后, 能更清楚的了解哪些情况下不生效