Objective-C 对象复制(深复制/浅复制)

转载地址:http://blog.csdn.net/musou_ldns/article/details/7782203

objective-c中有NSCopying和NSMutableCopying两种协议,分别定义了copy和mutableCopy两个方法。
如果某个类要实现这两种对象拷贝,必须实现上述两个协议。

首先我们要搞清楚copy和mutalbeCopy的区别。
众所周知,objective-c中,有NSString和NSMutableString,NSArray和NSMutableArray等等配对的类。
其中前者是不可变的类(没有set,add,append等方法),后者是可变的类(有set,add,append等方法)。
copy和mutableCopy的区别在于它们的返回值是不可变类型还是可变类型。
不管被复制的对象是不可变的还是可变的,copy的返回值类型始终是不可变类型。
同样,不管被复制的对象是不可变的还是可变的,mutableCopy的返回值类型始终是可变类型的。
比如,
NSArray *array = [[NSArray alloc] init];
id arr1 = [array copy]; // arr1是NSArray类型
id arr2 = [array mutableCopy]; // arr2是NSMutableArray类型
再比如,
NSMutableArray *array = [[NSMutableArray alloc] init];
id arr1 = [array copy]; // arr1是NSArray类型
id arr2 = [array mutableCopy]; // arr2是NSMutableArray类型

另外还有个深复制和浅复制的问题,
一般的复制都是浅复制,也就是只复制对象类本身,该类所参照的对象不复制。
但是不可变类的copy函数,其实并没有复制,而只是把指针复制了一下,我们把它称为指针复制。
比如,
NSArray *array = [[NSArray alloc] init];
id arrCopy = [array copy];
此时,arrCopy和array指向同一个内存空间,用arrCopy==array作判断条件是成立的。
且此时arrCopy和array的retainCount是2,说明该复制只是把retainCount+1,并没有真正复制内存。
这样做其实是有道理的,因为NSArray是不可变的,即使不真正复制内存,也不影响其当做复制的来正常使用。
但NSArray的mutableCopy、NSMutableArray的copy和mutableCopy是真正的复制内存,而且是浅复制。
其它可变类型和不可变类型的copy和mutableCopy也遵循同样的规则。


你可能感兴趣的:(NSCopy,NSMutableCopy)