首先來介紹一下對象的拷貝的概念吧:
為
什么要由對象的拷貝這么一個概念呢?看一個場景:假如現在一個對象中又一個數組對象,現在我們生成一個對象,同時將這個對象賦值給另外一個對象,那么現在
問題是這兩個對象中的數組對象是同一個,那么如果一個對象中去修改這個數值中的內容,另外一個對象中的數組內容也會被修改,相當于這個數組對象是共享的,
當然我們有時候是不希望這種形式的出現的,這時候我們就出現了對象的拷貝。
深拷貝和淺拷貝
在拷貝對象中也是有深拷貝和淺拷貝之分的
淺拷貝:只拷貝所有屬性對象的指針
深拷貝:拷貝屬性對象的內容
.h
#import
@interfacePerson?:?NSObject?
@property(nonatomic,retain)NSMutableArray*apples;
@property(nonatomic)intage;
@end
.m
#import "Person.h"
@implementationPerson
-?(id)copyWithZone:(NSZone*)zone{
//創建一個新的副本對象
//這個方法是會被繼承的,所以這里還是不用
//[Person?allocWithZone:<#(struct?_NSZone?*)#>];
Person*?p?=?[[selfclass]allocWithZone:zone];
//p.apples?=?_apples;//是指針賦值,所以還是淺拷貝
//深拷貝
//拷貝之后引用計數會+1,需要release以下
p.apples=?[_applesmutableCopy];
p.age=?_age;
[p.applesrelease];
//但是如果我們使用->語法就不需要了,因為我們沒有使用set方法,引用計數沒有操作
//但是這種方式我們不采用
//p->_apples?=?[_apples?mutableCopy];
returnp;
}
@end