標籤: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] a2014-08-16 11:17:21.526 text[1679:303] b2014-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;}
看一下代碼其實就明白深複製是什麼意思了,深複製就是重新開闢一塊空間,用原來的值進行初始化;
就是這樣;