在實際開發(fā)中,對于一些自定義的對象堵漱,有時我們也希望對其進行復制综慎。對于自定義對象的復制,首先要保證在類的定義中遵守NSCopying協(xié)議勤庐,然后實現copyWithZone:方法示惊,對于類中定義的屬性也需要綜合考慮其定義中有關內存管理的特性(strong/weak/copy/assign)。
1愉镰、類的定義與復制
首先自定義一個ClassB類米罚,并在該類中,添加4個屬性丈探,這4個屬性分別使用了copy录择、strong、weak和assign關鍵字碗降。如下所示:
#import
#import "ClassA.h"
@interfaceClassB:NSObject
@property(nonatomic,copy)NSString*name;
@property(nonatomic,strong)ClassA*customClass;
@property(nonatomic,weak)iddelegate;
@property(nonatomic,assign)intnumber;
@end
為了實現對該類對象的復制隘竭,要求該類遵守NSCopying協(xié)議,同時在類的.m文件中讼渊,實現copyWithZone:方法动看,在該方法中,可以分別實現當調用copy方法時爪幻,對該類對象進行深復制或者淺復制菱皆。
在main.m文件中,添加一個函數挨稿,用來復制ClassB的對象仇轻。代碼如下:
/**
*? 自定義對象拷貝(copy)
*/
voidcopyTest5(){
ClassA*classA=[[ClassAalloc]init];
ClassB*myClass=[[ClassBalloc]init];
myClass.name=@"ABC";
myClass.customClass=classA;
myClass.delegate=classA;
myClass.number=100;
ClassB*myClass1=[myClass copy];
NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】",[ClassBclass],myClass,myClass1);
NSLog(@"Original Object----copy property: 【%p】, strong property: 【%p】,weak property: 【%p】, assign property:【%d】",myClass.name,myClass.customClass,myClass.delegate,myClass.number);
NSLog(@"copy? ? Object----copy property: 【%p】, strong property: 【%p】,weak property: 【%p】, assign property:【%d】",myClass1.name,myClass1.customClass,myClass1.delegate,myClass1.number);
}
2、淺復制該類的對象
當僅僅需要對該對象進行淺復制時奶甘,可以在copyWithZone:方法中篷店,直接返回要拷貝的對象即可。
代碼實現:
在ClassB.m文件中甩十,實現copyWithZone:方法船庇。
-(id)copyWithZone:(NSZone*)zone{
returnself;
}
運行結果如下吭产。我們可以看到侣监,拷貝的對象和原對象指向同一個內存地址,即淺拷貝是指針拷貝臣淤。并且復制對象的屬性也是淺復制橄霉。
3、深復制該類的對象
當需要對自定義對象深復制時邑蒋,那么就需要在copyWithZone:方法中調用alloc以及init方法姓蜂,重新開辟一塊新的內存空間按厘。另外,對于屬性的復制過程中钱慢,也需要考慮到屬性自身的特性逮京,例如:有copy特性的屬性需要重新生成新的副本,strong以及weak只需要做指針賦值即可束莫。
代碼實現:
在ClassB.m文件中懒棉,實現copyWithZone:方法。
-(id)copyWithZone:(NSZone*)zone{
ClassB*copyObject=[[[selfclass]allocWithZone:zone]init];
copyObject.name=[self.name mutableCopy];
copyObject.customClass=self.customClass;
copyObject.delegate=self.delegate;
copyObject.number=self.number;
returncopyObject;
}
運行結果如下览绿。我們可以看到策严,通過深復制,我們在內存中創(chuàng)建了一個原對象的副本饿敲,并且設置為copy特性的屬性妻导,也進行了深復制,而strong/weak特性的屬性僅僅做了指針復制怀各。