第一、復制對象的基本概念
復制一個對象為副本,開辟一塊新的內存來存儲副本對象。
第二、如果一個對象想具備復制的功能,必須實現<NSCopying>協議和<NSMutableCopying>協議
NSObject自帶的常用的對象有:NSNumber、NSString、NSArray、NSDictionary、NSMutableArray、NSMutableDictionay、NSMutableString,copy產生的對象時不可變的,mutableCopy產生的對象時可變的
第三、retain和copy的區別
copy與retain的區別: copy是創建一個新對象,retain是創建一個指針,引用對象計數加1。Copy屬性表示兩個對象內容相同,新的對象retain為1 ,與舊有對象的引用計數無關,舊有對象沒有變化。copy減少對象對上下文的依賴?! etain屬性表示兩個對象地址相同(建立一個指針,指針拷貝),內容當然相同,這個對象的retain值+1也就是說,retain 是指針拷貝,copy 是內容拷貝?! ‘斎辉趇os中并不是所有的對象都支持copy,mutableCopy,遵守NSCopying 協議的類可以發送copy消息,遵守NSMutableCopying 協議的類才可以發送mutableCopy消息。假如發送了一個沒有遵守上訴兩協議而發送 copy或者 mutableCopy,那么就會發生異常。但是默認的ios類并沒有遵守這兩個協議。如果想自定義一下copy 那么就必須遵守NSCopying,并且實現 copyWithZone: 方法,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實現 mutableCopyWithZone: 方法。@autoreleasepool { NSMutableArray *array=[NSMutableArray arrayWithObjects:@"one",@"two",@"three",@"four",nil]; NSMutableArray *retainArray=[array retain]; [retainArray removeLastObject]; for(NSString *str in array) { NSLog(@"the part is %@",str); } NSLog(@"the retaincount is %ld",[retainArray retainCount]); // insert code here... NSLog(@"Hello, World!"); }第四、COPY和MutableCopy的區別
COPY 返回一個不可變對象的副本,MutalbeCopy返回一個可變對象的副本。
NSArray *array=[NSArray arrayWithObjects:@"one",@"two", nil]; NSMutableArray *array1=[array copy]; [array1 addObject:@"three"]; //error NSMutableArray *array2=[array mutableCopy]; [array2 addObject:@"three"]; //right // insert code here... NSLog(@"Hello, World!");第五、淺copy和深copy淺復制盡復制對象本身,對象里的屬性、包含的對象不做復制
深復制復制全部,包括對象的屬性和其他對象
Foundation框架支持復制的類,默認是淺復制
NSMutableArray *array=[[NSMutableArray alloc] init]; for(int i=0;i<3;i++) { NSObject *obj=[[NSObject alloc] init]; [array addObject:obj]; [obj release]; } for(NSObject *obj1 in array) { NSLog(@"地址為 %p,引用計數是 %ld",obj1,obj1.retainCount); } NSMutableArray *array2=[array copy]; for(NSObject *obj2 in array2) { NSLog(@"地址為 %p,引用計數是 %ld",obj2,obj2.retainCount); }2013-09-30 17:28:01.492 FDAS[681:303] 地址為 0x1001081f0,引用計數是 12013-09-30 17:28:01.506 FDAS[681:303] 地址為 0x100108230,引用計數是 12013-09-30 17:28:01.506 FDAS[681:303] 地址為 0x100108240,引用計數是 12013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x1001081f0,引用計數是 22013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x100108230,引用計數是 22013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x100108240,引用計數是 2
新聞熱點
疑難解答