深拷貝與淺拷貝
只有實現了NSCoping協議的對象才能進行copy,自定義對象的copy需要實現NSCopy協議,具體是深拷貝還是淺拷貝取決于協議如何實現
copy得到的類型一定是不可變的;mutableCopy得到的類型一定是可變的
淺拷貝:拷貝過后內存地址(指針)沒有改變;
深拷貝:拷貝過后內存地址(指針)發生改變;
不可變的類型進行不可變的拷貝是淺拷貝,其他都是深拷貝;只要見到mutable,都是深拷貝(不管是拷貝類型還是拷貝方法);
1)NSString: copy 淺拷貝 , 拷貝過后為 NSString 不可變;
mutableCopy 深拷貝, 拷貝過后為 NSMutableString 可變;
2)NSMutableString: copy 深拷貝 , 拷貝過后為 NSString 不可變;
mutableCopy 深拷貝 , 拷貝過后為 NSMutableString 可變;
(NSArray, NAMutableArray) (NSDictionary, NSMutableDictionary) NSSet(集合)同上類似
3)copy時順便會附帶一個Strong
4)@autoreleasepool{} 自動釋放池; for循環創建一個對象就釋放一個對象
5)NSAutoreleasepool *pool = [NSAutoreleasepool alloc] init];
注意:
錯誤代碼:@PRoperty ( nonatomic,copy)NSMutableArray * mutableArray;
運用該種寫法時必須重寫其set放法;
正確寫法:@property ( nonatomic,retain)NSMutableArray * mutableArray;
ARC
ARC中[super delloc]方法已不能調用,但delloc方法依然有效,所以依然可以 [[NSNotificationCenter defaultCenter] removeObser:self];
Strong,Weak
1)Strong為強引用,Strong指針指向的對象永不釋放,沒有strong指針指向它時,它會立即釋放;
2)weak是弱應用,當其對象被釋放時自動置為空;沒有Strong和weak指針修飾的對象默認為__strong;
3)在ARC中@property retain的對象在編譯是會自動編譯為Strong
4)strong,weak不修飾簡單類型,簡單類型用assgin 或 unsafe_unretained
5)在ARC的block中,之前為防止循環引用用__block,現在用weak;
在ARC環境下添加非ARC文件:-fno- objc-arc
在非ARC環境下添加ARC文件:-fobjc-arc
拓展:
轉換, 橋接
1).m OC和 C 可以直接混編;
2).m--->.mm OC與C ,C++混編時;
3) .cpp C和C++混編,不與OC混編 ;
4)__bridge_retained OC--->C 轉換的時候會retain一次;(用于全局的方法,且方法必須是在.h中聲明過的方法);
5)__bridge_transfer C--->OC 轉換的時候會release一次;
6)__bridge C<--->OC 相互轉換時引用計數不產生任何更改;(用于局部的方法,且方法必須是在.h中聲明過的方法);
|
新聞熱點
疑難解答