Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copymutableCopy 的区别以及相关用法。

Objective - C 中可变对象和不可对象经常用的如下:

NSString、 NSMutableString | NSArray、NSMutableArray,

分开说:

A:NSString、 NSMutableString

二者的copy方法返回类型为:

[NSString copy]                         浅拷贝,指针复制,返回的对象的地址和方法的接收者一样,引用计数加1。

[NSMutableString copy]              深拷贝, 深复制,重新 Alloc 一个 NSString 的对象,并返回。返回对象的地址和方法接收者的地址不一样,并且方法接受者的内容改变不影响返回对象,同时返回对象的内容不可以改变。

二者的MutableCopy方法返回的类型为:

[NSString mutableCopy]             深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。

[NSMutableString mutableCopy]  深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。

附:浅拷贝和深拷贝的区别

浅拷贝,父对象独立,子对象共享。

深拷贝,父对象独立,子对象独立。

B: NSArray、 NSMutableArray

二者的copy方法返回类型为:

[NSArray copy]         指针复制,返回的对象的地址和方法的接受者的地址一样,引用计数加1,同时array里面的对象的地址都是一样的。

[NSMutableArray copy]  “false深复制” 重新Alloc一个 NSArray对象,并返回,返回对象的地址和方法接收者的地址不一样,并且方法接受者本身内容(增、减等操作,非包含对象内容的变化)改变不影响返回对象,同时返回对象的内容不可以改变。同时array里面的对象的地址都是一样的。

NSArray *srcArray = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSMutableArray *arrMCopy = [srcArray mutableCopy];
 
NSArray        *arrCopy = [srcArray copy];
 
(lldb) p srcArray
 
(NSArray *) $2 = 0x0cf667c0 @"3 objects"
(lldb) p arrCopy
 
(NSArray *) $0 = 0x0cf667c0 @"3 objects"
 
(lldb) p arrMCopy
 
(NSMutableArray *) $1 = 0x0d077ab0 @"3 objects"

二者的MutableCopy方法返回的类型为:

[NSArray mutableCopy]          “false深复制” 重新Alloc一个NSMutableArray 并返回,返回对象的地址和方法接收者的地址不一样,并且2者的本身对象的增加,删除等操作不影响另一者。同时array里面的对象的地址都是一样的。

[NSMutableArray mutableCopy]     “false深复制” 重新Alloc一个NSMutableArray 并返回,返回对象的地址和方法接收者的地址不一样,并且2者的本身对象的增加,删除等操作不影响另一者。同时array里面的对象的地址都是一样的。

 

总结:

1:对于不可变对象,copy都是浅复制,即指针复制。mutableCopy 都是Alloc一个新对象返回。

2:对于可变对象,copy和mutableCopy都是Alloc新对象返回。

3:不论是可变还是不可变对象,copy返回的对象都是不可变的,mutableCopy返回的对象都是可变的。

4:容器类对象,不论是可变的还是不可变的,copy,mutableCopy返回的对象里所包含的对象的地址和之前都是一样 的,即容器内对象都是浅拷贝。