copy 与 mutableCopy

深浅拷贝的区别就是看是否消耗了新的内存空间。

浅拷贝是指针拷贝,如下图左边Array1和Array2指向同一块内存地址:

Array2 = [Array1  copy]

深拷贝是对象拷贝,如下图右Array1和Array2,虽然元素一样,但是却指向不同的内存地址:

//Array2复制了Array1的对象,并开辟了一个新的内存空间
Array2 = [Array1 mutableCopy]
copy 与 mutableCopy_第1张图片
图片来自网络.png
/*凡是可变对象,不管使用copy还是mutableCopy都是深拷贝
凡是不可变对象,使用copy是浅拷贝,mutableCopy是深拷贝*/
NSMutableString *m_string = [NSMutableString stringWithString:@"m_abc"];
NSLog(@"%p %p %p",m_string,[m_string mutableCopy],[m_string copy]);
//0x1004004e0 0x100400520 0x6362615f6d55
//这三个地址内存都不一样

NSString *c_string = @"c_abc";
NSLog(@"%p %p %p",c_string,[c_string mutableCopy],[c_string copy]);
//0x100002150 0x100303410 0x100002150
//用copy时,内存地址跟原来的一样

NSMutableArray *m_array = [NSMutableArray array];
NSLog(@"%p %p %p",m_array,[m_array mutableCopy],[m_array copy]);
//0x1003035d0 0x100303650 0x1002027d0

NSArray *c_array = @[@"abc"];
NSLog(@"%p %p %p",c_array,[c_array mutableCopy],[c_array copy]);
//0x100202680 0x100202b50 0x100202680

总结:如果想新建一块内存地址来存储变量,就用深拷贝,否则用浅拷贝

你可能感兴趣的:(copy 与 mutableCopy)