集合對象與非集合對象遵循的規則是同樣,不同的地方在於:數組
集合對象的深拷貝只是針對集合對象的深拷貝,並非嚴格意義上的深拷貝,而是單層深拷貝。
單層深拷貝:對集合對象而言,深拷貝只是將第一層對象也就是該對象進行了深拷貝,而集合對象的元素仍然只是淺拷貝。
複製代碼
該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
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);複製代碼
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