集合對象與非集合對象的拷貝

集合對象與非集合對象遵循的規則是同樣,不同的地方在於:數組

集合對象的深拷貝只是針對集合對象的深拷貝,並非嚴格意義上的深拷貝,而是單層深拷貝。
單層深拷貝:對集合對象而言,深拷貝只是將第一層對象也就是該對象進行了深拷貝,而集合對象的元素仍然只是淺拷貝。
複製代碼

一、非集合對象的拷貝

該Person類已經實現了NSCopy協議,非集合對象只要實現了NSCopy協議,無論是copy仍是mutableCopy都會對該對象進行深拷貝bash

Person *person = [Person new];    
person.name = @"李四";
person.age = 18;

Person *person2 = [person copy];
Person *perspn3 = [person mutableCopy];

NSLog(@"\nperson:%@\nperson2:%@\nperson3:%@\n",person,person2,perspn3);複製代碼


二、集合對象的拷貝

這裏的集合對象咱們已數組爲例。atom

(1)、NSArray的拷貝

NSArray的copy仍然是淺拷貝。
spa

Person *person = [Person new];
person.name = @"李四";
person.age = 18;

NSArray *array = @[person];
NSArray *array2 = [array copy];
NSLog(@"\narray:%p\narray2:%p\n",array,array2);複製代碼


NSArray的mutableCopy是深拷貝。3d

NSMutableArray *muArray = [array mutableCopy];
NSLog(@"\nmuArray:%p",muArray);複製代碼


(2)、NSMutableArray的拷貝

NSMutableArray的copy和mutableCopy都是深拷貝。code

Person *person = [Person new];
person.name = @"李四";
person.age = 18;

NSMutableArray *muArray = [NSMutableArray arrayWithArray:@[person]];
NSArray *array = [muArray copy];
NSMutableArray *muArray2 = [muArray mutableCopy];
NSLog(@"\nmuArray:%p\narray:%p\nmuArray2:%p",muArray,array,muArray2);複製代碼


可是以上所說的關於NSArray、NSMutableArray的深淺拷貝都是隻針對NSArray、NSMutableArray,裏面的元素也就是person對象,其實還只是淺拷貝,也就是單層深拷貝,要想達到真正意義上的深拷貝還須要對person對象進行深拷貝。cdn

三、對集合對象和集合對象元素進行深拷貝

NSMutableArray *muArray = [NSMutableArray arrayWithArray:@[person]];
NSArray *array2 = [[NSArray alloc] initWithArray:muArray copyItems:YES];
NSLog(@"\nmuArray:%p\nmuArray person:%@\narray2:%p\narray2 person:%@",muArray,muArray.firstObject,array2,array2.firstObject);複製代碼


或者經過直接對元素進行深拷貝對象

NSMutableArray *muArray = [NSMutableArray arrayWithArray:@[person]];
NSMutableArray *muArray3 = [NSMutableArray array];
for (Person *person in muArray) {
    [muArray3 addObject:[person copy]];
}
NSLog(@"\nmuArray:%p\nmuArray person:%@\nmuArray3:%p\nmuArray3 person:%@\n",muArray,muArray.firstObject,muArray3,muArray3.firstObject);複製代碼


四、常見錯誤

@property (nonatomic, copy) NSMutableArray *arr;

- (void)arrMCopyTest {

    NSMutableArray *arrM = [NSMutableArray arrayWithObjects:@"123",@"456", nil];

    self.arr = arrM;

    // 下面代碼崩潰

    [self.arr addObject:@"789"];
}
複製代碼

由於self.arr爲copy修飾,那麼self.arr = arrM就至關於_arr = [arrM copy];blog

相關文章
相關標籤/搜索