集合对象与非集合对象遵循的规则是同样,不同的地方在于:数组
集合对象的深拷贝只是针对集合对象的深拷贝,并非严格意义上的深拷贝,而是单层深拷贝。
单层深拷贝:对集合对象而言,深拷贝只是将第一层对象也就是该对象进行了深拷贝,而集合对象的元素仍然只是浅拷贝。
复制代码
该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