浅拷贝:一个强指针,一个弱指针同时指向一个空间,强引用的对象释放后,弱引用跟着指向空指针
引用计数拷贝:避免了浅拷贝和深拷贝的缺点,被大量使用
两个强指针指向同一空间以上两者是共用同一块空间,优点,节省存储空间
深拷贝:
最大的特点:两个指针各自有自己的存储空间
优点:两个指针互不干扰
缺点:耗费的存储空间大
1. 浅拷贝:
2个指针同时指向一空间,一个释放了,另一个也被迫释放(强引用+弱引用),节省存储空间(强引用的空间释放了弱引用指针则为空)
TRStudent *s1 = [[TRStudent alloc]init];
__weak TRStudent *s2 = s1 ;
2. 引用计数的拷贝:
2个指针同时指向一空间,一个释放了,另一个不被迫释放(强引用+强引用)
TRStudent *s1 = [[TRStudent alloc]init];
TRStudent *s2 = s1 ;
以上为同一存储空间
深拷贝:2个不同的存储空间 (面试题)
int p1 = (int)malloc(4);
*p1 = 10;
int *p2 = (int *)malloc(4);
*p2 *p1;
3. 深拷贝:
NSCopyiny协议:
1 自定义类实现深拷贝时,需要采纳 NSCopying 协议
2 在自定义的.m文件中实现NSCopying协议中的方法 copyWithZone
3 在主函数中,用copy方法实现深拷贝,该方法在函数体中,会自动调用copyWithZone方法
4 copy可以作为property的参数,使属性赋值时得到的是副本(深拷贝)
三部曲:
采纳<NSCopyiny>, 实现函数体(重写), 调用[b1 copy]得到副本
// 1.在.h文件中采纳<NSCopyiny>:
@interface TRStudent : NSObject<NSCopying>
// 2.实现函数体(重写)与工厂方法很像;
不用放入__autirelaesing
alloc不同 ->allocWithZone
带参初始化用self.xxx
-(id)copyWithZone:(NSZone *)zone{
TRCicle *c = [[TRCicle allocWithZone:zone]initWithRadius:self.radius andOrgin:self.center];
return c;
}
-(id)copy{
….
id obj = [self copyWithZone]; //方法调用
…
return obj;
}
// 3.调用[b1 copy]得到副本:
TRCicle *c2 = [c1 copy];