對象的復制有深復制和淺復制兩種,聽上去高大上會很難,其實很簡單;
來舉個例子:
NSMutableArray * array1 = [NSMutableArray arrayWithObjects:@"a" ,@"b", nil]; NSMutableArray *array2 = array1; [array2 addObject:@"c"]; for(NSString *s in array1) { NSLog(@"%@",s); }
2014-08-16 11:17:21.524 text[1679:303] a 2014-08-16 11:17:21.526 text[1679:303] b 2014-08-16 11:17:21.526 text[1679:303] c
這就是淺復制,我們復制了數組array1的指針給array2,假設array1指向oxfffff這個區域,現在我們將array2 =array1是將array1指向的地址賦值給了array2,當我們操作array2時實際上是操作的那塊區域,而array1也指向那塊區域,所以就會出現這個結果;
這就是淺復制;
深復制:
上面的例子中,如果要想修改array2,而array1不變就需要使用深復制。深復制有可變復制和不可變復制,意思就是復制體可不可以變,就像nsarray是不可變的而nsmutablearry是可變的。需要用到 copy和mutablecopy方法;
如果是系統提供的類,如NSArray、NSString等可以直接使用copy、mutablecopy方法;
如果是自己創建的類,我們需要來實現代理
需要實現裡面的
-(id)copyWithZone:(NSZone *)zone
-(id) mutableCopyWithZone:(NSZone *)zone
方法,一個代表著是不可變復制,一個是可變復制;實現方法:
-(id)copyWithZone:(NSZone *)zone { first *new = [[first allocWithZone:zone]init]; new.string = self.string; return new; } -(id) mutableCopyWithZone:(NSZone *)zone { first *new = [[first allocWithZone:zone]init]; new.string = self.string; return new; }
看一下代碼其實就明白深復制是什麼意思了,深復制就是重新開辟一塊空間,用原來的值進行初始化;
就是這樣;