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];
相關文章
相關標籤/搜索