Objective-C 對象的復制有深復制和淺復制兩種,聽上去高大上會很難,其實很簡單;
來舉個例子:
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
看上面的,我們在array2中添加“c“,而遍裡array1時卻也有(array2中肯定也有c);
這就是淺復制,我們復制了數組array1的指針給array2,假設array1指向oxfffff這個區域,現在我們將array2 =array1是將array1指向的地址賦值給了array2,當我們操作array2時實際上是操作的那塊區域,而array1也指向那塊區域,所以就會出現這個結果;
這就是淺復制;
深復制:
上面的例子中,如果要想修改array2,而array1不變就需要使用深復制。深復制有可變復制和不可變復制,意思就是復制體可不可以變,就像nsarray是不可變的而nsmutablearry是可變的。需要用到 copy和mutablecopy方法;
如果是系統提供的類,如NSArray、NSString等可以直接使用copy、mutablecopy方法;
如果是自己創建的類,我們需要來實現代理<NSCopying>
需要實現裡面的
-(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;
}
看一下代碼其實就明白深復制是什麼意思了,深復制就是重新開辟一塊空間,用原來的值進行初始化;
就是這樣。
Objective-C中@property的所有屬性詳解 http://www.linuxidc.com/Linux/2014-03/97744.htm
Objective-C 和 Core Foundation 對象相互轉換的內存管理總結 http://www.linuxidc.com/Linux/2014-03/97626.htm
使用 Objective-C 一年後我對它的看法 http://www.linuxidc.com/Linux/2013-12/94309.htm
10個Objective-C基礎面試題,iOS面試必備 http://www.linuxidc.com/Linux/2013-07/87393.htm
Objective-C適用C數學函數 <math.h> http://www.linuxidc.com/Linux/2013-06/86215.htm