深淺拷貝的區別就是看是否消耗了新的內存空間。
淺拷貝是指針拷貝,如下圖左邊Array1和Array2指向同一塊內存地址:
Array2 = [Array1 copy]
深拷貝是對象拷貝,如下圖右Array1和Array2,雖然元素一樣,但是卻指向不同的內存地址:
//Array2復制了Array1的對象,并開辟了一個新的內存空間
Array2 = [Array1 mutableCopy]
圖片來自網絡.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
總結:如果想新建一塊內存地址來存儲變量,就用深拷貝,否則用淺拷貝