copy与mutableCopy都是深拷贝,区别是mutableCopy拷贝出的对象是可变的。

 

OC对象基本都是通过指针访问,所以一般情况下,通过对指针的赋值都是浅拷贝,即只是拷贝了一份对象的指针,对象还是只有一个。

例:

NSMutableString *str = [NSMutableString stringWithString:@"abc"];

NSString *str2 = str;

str与str2指向的是同一个对象,str变了str2随之改变。

 

NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];

NSArray *array2 = array;

 array1与array2指向的是同一个对象,array对象的内存地址相同,array1变了array2随之改变。这里有一个注意点,array2中存的仍是obA,obB,obC,只不过会把他们的引用计数加一。

 

深拷贝:

NSMutableString *str = [NSMutableString stringWithString:@"abc"];

NSString *str2 = [str copy];

str与str2指向的是不同的对象,str变了str2不会变。

 

NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];

NSArray *array2 = [array copy];

 array1与array2指向的是不同的对象,array对象的内存地址不同(注意,内部obA,obB,obC的内存地址相同),array1变了array2不会变,这里的变指的是array中的元素增加或减少,假设array1少了一个obC,array2中仍是obA,obB,obC。同样有一个注意点,array2中存的仍是对象的指针obA, obB, obC, 只不过他们的引用计数会加一,这时如果obA的某个属性变了,那么array2中obA的某个属性也会跟着变,原因很简单,因为这两个obA就是同一个对象。所以这里的深拷贝只是指针级的深拷贝。

 

所以如果想做到内容级的深拷贝,一种方法是手动对array中每一个对象执行copy操作,然后加到新数组中,前提是array中的对象都支持copy协议。

 

例:

NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];

NSMutableArray *array2 = [[NSMutableArray alloc] init];

 for(id ob in array1) {

    id obCopy = [ob copy];

    [array2 addObject:obCopy];

}

 

这种情况下不论是array对象还是array中的内容被拷贝完都是两份,所以array1中无论是数组内容增加减少,或者其中的对象obA的某个属性改变,对array2中的元素都没有影响。不过实际代码中这种情况比较少,自己的项目经历中貌似只有一个冬奥会轮播图的控件中用到过。

 

 mutaleCopy 与copy的区别也很简单,mutable么就是可变的,所以mutableCopy拷贝出来的都是可变的对象(通常为NSMutableString, NSMutableArray, NSMutableDictionary),copy拷贝出来的是不可变的对象。

posted on 2018-03-13 11:23  ximenchuixie  阅读(149)  评论(0编辑  收藏  举报