淺拷貝:一個強指針,一個弱指針同時指向一個空間,強引用的對象釋放後,弱引用跟着指向空指針面試
引用計數拷貝:避免了淺拷貝和深拷貝的缺點,被大量使用
兩個強指針指向同一空間函數以上二者是共用同一塊空間,優勢,節省存儲空間指針
深拷貝:
最大的特色:兩個指針各自有本身的存儲空間
優勢:兩個指針互不干擾
缺點:耗費的存儲空間大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];