浅拷贝:一个强指针,一个弱指针同时指向一个空间,强引用的对象释放后,弱引用跟着指向空指针
引用计数拷贝:避免了浅拷贝和深拷贝的缺点,被大量使用
两个强指针指向同一空间以上两者是共用同一块空间,优点,节省存储空间
深拷贝:
最大的特点:两个指针各自有自己的存储空间优点:两个指针互不干扰缺点:耗费的存储空间大
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的参数,使属性赋值时得到的是副本(深拷贝)
三部曲:
采纳, 实现函数体(重写), 调用[b1 copy]得到副本// 1.在.h文件中采纳 :@interface TRStudent : NSObject // 2.实现函数体(重写)与工厂方法很像;不用放入__autirelaesingalloc不同 ->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];