Copy

一:非容器类

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出一个新的对象,对象的属性也是新的(深拷贝)

你可能感兴趣的:(Copy)