iOS開發知識點:理解assign,copy,retain變strong

來源:互聯網
上載者:User

標籤:

 

 

一、.h和.m檔案的變化說明

 

1.對於.h標頭檔,主要是將屬性定義由retain變為strong

 

 

 

[java] view plaincopy
  1. @property (retain, nonatomic)  

變為

 

 

[java] view plaincopy
  1. @property (strong, nonatomic)  


2.在ARC之前,我們經常在.m中使用分類拓展來增加私人的property

 

 

[java] view plaincopy
  1. @interface MJViewController ()  
  2. @property (nonatomic, retain) NSArray *data;  
  3. @end  

這樣做主要是簡化執行個體對象的手動記憶體管理,讓property的setter方法自動管理原來對象的釋放,以及新對象的retain。但是有了ARC,這樣的代碼就不再需要了。一般來說,僅僅為了簡化記憶體管理,是不再需要使用property的,雖然你仍然可以這樣做,但直接使用執行個體變數是更好的選擇。只有那些屬於public的執行個體變數,才應該定義為property

我們可以直接在.m類實現中定義private執行個體變數,不必寫分類拓展了:

 

 

 

[java] view plaincopy
  1. @implementation MJViewController {  
  2.     NSArray *data;  
  3. }  

不過還是要在viewDidUnload方法中將data設定為nil,因為data是個strong指標,當不再使用一個對象時,應該設定為nil

 

 

[java] view plaincopy
  1. - (void)viewDidUnload {  
  2.     [super viewDidUnload];  
  3.     data = nil;  
  4. }  


二、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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.