標籤:
一、.h和.m檔案的變化說明
1.對於.h標頭檔,主要是將屬性定義由retain變為strong
[java] view plaincopy
- @property (retain, nonatomic)
變為
[java] view plaincopy
- @property (strong, nonatomic)
2.在ARC之前,我們經常在.m中使用分類拓展來增加私人的property
[java] view plaincopy
- @interface MJViewController ()
- @property (nonatomic, retain) NSArray *data;
- @end
這樣做主要是簡化執行個體對象的手動記憶體管理,讓property的setter方法自動管理原來對象的釋放,以及新對象的retain。但是有了ARC,這樣的代碼就不再需要了。一般來說,僅僅為了簡化記憶體管理,是不再需要使用property的,雖然你仍然可以這樣做,但直接使用執行個體變數是更好的選擇。只有那些屬於public的執行個體變數,才應該定義為property
我們可以直接在.m類實現中定義private執行個體變數,不必寫分類拓展了:
[java] view plaincopy
- @implementation MJViewController {
- NSArray *data;
- }
不過還是要在viewDidUnload方法中將data設定為nil,因為data是個strong指標,當不再使用一個對象時,應該設定為nil
[java] view plaincopy
- - (void)viewDidUnload {
- [super viewDidUnload];
- data = nil;
- }
二、IBOutlet
在ARC中,所有IBOutlet屬性都推薦使用weak, 這些view對象已經屬於View Controller的view hierarchy,不需要再次定義為strong。因此,這些定義為weak的IBOutlet屬性都不需要在IBOutlet中設定為nil
三、@property的修飾符小結
• strong : 該屬性值對應 __strong 關鍵字,即該屬性所聲明的變數將成為對象的持有人,等同於"retain"
• weak : 該屬性對應 __weak 關鍵字,與 __weak 定義的變數一致,該屬性所聲明的變數將沒有對象的所有權,並且當對象被釋放之後,對象將被自動賦值nil,記住IBOutlet應該使用weak
• unsafe_unretained : 等效於__unsafe_unretaind關鍵字聲明的變數,等同於之前的"assign",iOS 5之前的系統用該屬性代替 weak 來使用
• copy : 和之前的copy一樣,複製一個對象並建立strong關聯
• assign : 對象不能使用assign,但原始類型(BOOL、int、float)仍然可以使用
舉個例子:
NSString *houseOfMM = [[NSString alloc] initWithString:‘裝梵幾的三室兩廳‘];
上面一段代碼會執行以下兩個動作:
1 在堆上分配一段記憶體用來儲存@‘ 裝梵幾的三室兩廳 ‘ ,比如:記憶體位址為 0X1111 內容為 ‘ 裝梵幾的三室兩廳‘ ,
2 在棧上分配一段記憶體用來儲存 houseForWife ,比如:地址為 0XAAAA 內容自然為 0X1111
下面分別看下(assign,retain,copy):
1.assign的情況: NSString * myHouse = [ houseOfMM assign ];
此時 myHouse 和 houseOfMM 完全相同,地址都是 0XAAAA ,內容為 0X1111 ,即 myHouse 只是 houseOfMM 的別名,對任何一個操作就等於對另一個操作。因此 retainCount 不需要增加.(同進同出,關係好,一把鑰匙,給我拿著)
2.retain的情況: NSString * myHouse = [ houseOfMM retain ];
此時 myHouse 的地址不再為 0XAAAA ,可能為 0XAABB ,但是內容依然為 0X1111 .因此 myHouse 和 houseOfMM 都可以管理‘ 裝梵幾的三室兩廳 ‘所在的記憶體。因此 retainCount 需要增加1.(有些獨立,各自進出,兩把鑰匙)
3.copy的情況: NSString * myHouse = [ houseOfMM copy ];
此時會在堆上重新開闢一段記憶體存放@‘裝梵幾的三室兩廳‘,比如0X1122,內容為@‘裝梵幾的三室兩廳‘,同時會在棧上為myHouse分配空間,比如地址:0XAACC,內容為0X1122,因此retainCount增加1供myHouse來管理0X1122這段記憶體.(兩套@‘裝梵幾的三室兩廳‘,條件好,分居了,房子一人一套,所以鑰匙一人一把。)
什麼時候用assign,當然是破房子,簡裝的房子拉
基礎類型(簡單類型,原子類型):NSInteger,CGPoint,CGFloat,C資料類型(int,float,double,char等)
什麼時候用copy
含有可深拷貝的mutable子類的類,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
(可深度拷貝的房子)
但是NSMutableArray這樣的不可以,Mutable的不能用copy,不然初始化會有問題。切記
什麼時候用retain
其他NSObject和其子類對象好嘛 (大多數)
ARC中的strong相當於非ARC中的retain,ARC來了以後多搞一把鑰匙就strong了啦。
抄襲:http://wenku.baidu.com/view/ab6ed804bed5b9f3f90f1c7d.html
有空的話翻譯一下好嘛:
http://clang.llvm.org/docs/AutomaticReferenceCounting.html
https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html
http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html
先看這個 :
http://blog.csdn.net/favormm/article/details/7023322
http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/
http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/
iOS開發知識點:理解assign,copy,retain變strong