第一、復(fù)制對象的基本概念
復(fù)制一個對象為副本,開辟一塊新的內(nèi)存來存儲副本對象。
第二、如果一個對象想具備復(fù)制的功能,必須實現(xiàn)<NSCopying>協(xié)議和<NSMutableCopying>協(xié)議
NSObject自帶的常用的對象有:NSNumber、NSString、NSArray、NSDictionary、NSMutableArray、NSMutableDictionay、NSMutableString,copy產(chǎn)生的對象時不可變的,mutableCopy產(chǎn)生的對象時可變的
第三、retain和copy的區(qū)別
copy與retain的區(qū)別: copy是創(chuàng)建一個新對象,retain是創(chuàng)建一個指針,引用對象計數(shù)加1。Copy屬性表示兩個對象內(nèi)容相同,新的對象retain為1 ,與舊有對象的引用計數(shù)無關(guān),舊有對象沒有變化。copy減少對象對上下文的依賴。 retain屬性表示兩個對象地址相同(建立一個指針,指針拷貝),內(nèi)容當(dāng)然相同,這個對象的retain值+1也就是說,retain 是指針拷貝,copy 是內(nèi)容拷貝。 當(dāng)然在ios中并不是所有的對象都支持copy,mutableCopy,遵守NSCopying 協(xié)議的類可以發(fā)送copy消息,遵守NSMutableCopying 協(xié)議的類才可以發(fā)送mutableCopy消息。假如發(fā)送了一個沒有遵守上訴兩協(xié)議而發(fā)送 copy或者 mutableCopy,那么就會發(fā)生異常。但是默認(rèn)的ios類并沒有遵守這兩個協(xié)議。如果想自定義一下copy 那么就必須遵守NSCopying,并且實現(xiàn) copyWithZone: 方法,如果想自定義一下mutableCopy 那么就必須遵守NSMutableCopying,并且實現(xiàn) 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的區(qū)別
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淺復(fù)制盡復(fù)制對象本身,對象里的屬性、包含的對象不做復(fù)制
深復(fù)制復(fù)制全部,包括對象的屬性和其他對象
Foundation框架支持復(fù)制的類,默認(rèn)是淺復(fù)制
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,引用計數(shù)是 %ld",obj1,obj1.retainCount); } NSMutableArray *array2=[array copy]; for(NSObject *obj2 in array2) { NSLog(@"地址為 %p,引用計數(shù)是 %ld",obj2,obj2.retainCount); }2013-09-30 17:28:01.492 FDAS[681:303] 地址為 0x1001081f0,引用計數(shù)是 12013-09-30 17:28:01.506 FDAS[681:303] 地址為 0x100108230,引用計數(shù)是 12013-09-30 17:28:01.506 FDAS[681:303] 地址為 0x100108240,引用計數(shù)是 12013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x1001081f0,引用計數(shù)是 22013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x100108230,引用計數(shù)是 22013-09-30 17:28:01.507 FDAS[681:303] 地址為 0x100108240,引用計數(shù)是 2
新聞熱點
疑難解答