ios copy

浅拷贝:一个强指针,一个弱指针同时指向一个空间,强引用的对象释放后,弱引用跟着指向空指针面试

引用计数拷贝:避免了浅拷贝和深拷贝的缺点,被大量使用
两个强指针指向同一空间函数

以上二者是共用同一块空间,优势,节省存储空间指针

深拷贝:
最大的特色:两个指针各自有本身的存储空间
优势:两个指针互不干扰
缺点:耗费的存储空间大code

1. 浅拷贝:

2个指针同时指向一空间,一个释放了,另外一个也被迫释放(强引用+弱引用),节省存储空间(强引用的空间释放了弱引用指针则为空)对象

TRStudent *s1 = [[TRStudent alloc]init];
__weak TRStudent *s2 = s1 ;
2. 引用计数的拷贝:

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;方法

3. 深拷贝:

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];
相关文章
相关标签/搜索