一:非容器类
1.copy: 返回一个不可变对象。分两种情况:
(1)若原对象是不可变对象,那么返回原对象,并将其引用计数加 1 ;
(2)若原对象是可变对象,那么创建一个新的不可变对象,并初始化为原对象的值,新对象的引用计数为 1。
2.mutableCopy 创建一个新的可变对象,并初始化为原对象的值,新对象的引用计数为 1;
二:容器类
1.copy
(1).不可变数组 copy retain计数加1地址相同
(2).可变数组 copy 地址不同 创建一个新的不可变对象容器内对象拷贝的是指针(引用计数加1)
(3).不可变数组 调用此方法:
[[NSArray alloc] initWithArray:array copyItems:YES];
文档说是深copy,但是copy后返回一个 地址不同新的不可变数组容器内拷贝的对象指针,引用计数加1(其实不是真正的深copy)
(4).不可变数组 调用此方法:
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject]];
深copy后返回一个 地址不同新的不可变数组容器内对象也是深拷贝(真正的深拷贝)
2.mutableCopy
(1).无论是否可变数组mutableCopy后返回一个 地址不同新的可变数组容器内对象拷贝的是指针(引用计数加1)
(2).可变数组 调用深拷贝方法:
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject]];
深copy后返回一个 地址不同新的可变数组容器内对象也是深拷贝(真正的深拷贝)
三.自定义对象
如果是我们定义的对象,那么我们自己要实现NSCopying,NSMutableCopying这样就能调用copy和mutablecopy了
- (id)copyWithZone:(NSZone*)zone
{
PersonObject*copy = [[[selfclass]allocWithZone:zone]init];
copy->name= [namecopy];
copy->imutableStr= [imutableStrcopy];
copy->age=age;
returncopy;
}
- (id)mutableCopyWithZone:(NSZone*)zone
{
PersonObject*copy =[[[selfclass]allocWithZone:zone]init];
copy.name= [self.namemutableCopy];
copy.age=age;
returncopy;
}
1.copy:copy出一个新的对象,对象的属性是指针拷贝引用计数增加
2.mutableCopy:copy出一个新的对象,对象的属性也是新的(深拷贝)