浅拷贝:一个强指针,一个弱指针同时指向一个空间,强引用的对象释放后,弱引用跟着指向空指针面试
引用计数拷贝:避免了浅拷贝和深拷贝的缺点,被大量使用
两个强指针指向同一空间函数以上二者是共用同一块空间,优势,节省存储空间指针
深拷贝:
最大的特色:两个指针各自有本身的存储空间
优势:两个指针互不干扰
缺点:耗费的存储空间大code
2个指针同时指向一空间,一个释放了,另外一个也被迫释放(强引用+弱引用),节省存储空间(强引用的空间释放了弱引用指针则为空)对象
TRStudent *s1 = [[TRStudent alloc]init]; __weak TRStudent *s2 = s1 ;
2个指针同时指向一空间,一个释放了,另外一个不被迫释放(强引用+强引用)it
TRStudent *s1 = [[TRStudent alloc]init]; TRStudent *s2 = s1 ;
以上为同一存储空间引用
深拷贝:2个不一样的存储空间 (面试题)
int p1 = (int)malloc(4);
p1 = 10;
int p2 = (int )malloc(4);
p2 *p1;方法
NSCopyiny协议:
1 自定义类实现深拷贝时,须要采纳 NSCopying 协议
2 在自定义的.m文件中实现NSCopying协议中的方法 copyWithZone
3 在主函数中,用copy方法实现深拷贝,该方法在函数体中,会自动调用copyWithZone方法
4 copy能够做为property的参数,使属性赋值时获得的是副本(深拷贝)协议
三部曲:di
采纳<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];