iOS 屬性中strong,weak,assign,retain,copy等特性

導語:

在初學iOS的時候,不明白property中屬性有什麼作用,比如strong, weak, assign, retain, copy等特性。

一、 Objective-C程序員的基本內存管理模型有三種

  1. 自動垃圾收集(現在Apple不建議使用垃圾收集,建議使用ARC進行代替)
  2. 手動引用計數和自動釋放池
  3. 自動引用計數(ARC, Xcode4.2發佈了自動引用計數之後,我們幾乎可以不再需要考慮內存管理的問題)


二、 手工管理內存計數

如果不打算使用ARC,就得學習引用計數工作的原理


當創建一個對象時,初始的引用計數爲1,爲保存對象的存在,每當創建引用 -> 對象需要將引用數加1,通過給對象發送retain消息實現,當不需要對象時,通過發送release,爲引用計數減1。當對象的引用計數爲0時,系統就會釋放它的內存。(釋放內存由系統的自動釋放池來實現,我們所需要做得主要就是對引用加1減1操作)

[myFraction retain]; //引用計數加1

//中間一系列對myFraction的操作

[myFraction release]; //引用計數減1


在手動引用計數環境中,可以添加assign,retain,copy特性


當我們使用以下這條命令時

self.property = newValue;


assign特性會是: 

property = newValue;

assign用於簡單賦值,不更改索引計數

對基礎數據類型 (例如NSInteger,CGFloat)和C數據類型(int, float, double, char, 等)適用簡單數據類型



retain特性會是: 

if (property != newValue){
[property release];
property = [newValue retain];
}

retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數爲1

此屬性只能用於Objective-C對象類型,而不能用於Core Foundation對象。



copy特性會是:

if (property != newValue){
[property release];
property = [newValue copy];
}

copy:建立一個索引計數爲1的對象,然後釋放舊對象,在賦值時使用傳入值的一份拷貝。



三、自動引用計數(ARC)

  1. 強變量(strong)

相當於老版本的retain,而且可以不再需要做release操作了

只要有強變量的引用,對象就不會釋放內存。


2.弱變量(weak)

相當於老版本的assign。但是隻適應於對象

當弱變量引用的對象被別的變量釋放,那麼弱變量會被自動設置爲nil,這樣可以有效地防止崩潰


3.strong 和 copy的區別

// on someObject:
@property (nonatomic, strong) NSString *text;
@@property (nonatomic, copy) NSString *textTwo;

//省略
. . .

NSMutableString *m = [NSMutableString stringWithString:@"Strawberry"];
someObject.text = m;
someObject.textTwo = m;
// at this point, someObject.text is @"Strawberry"
[m appendString:@" and banana"];
// now both m and someObject.text are @"Strawberry and banana",but someObject.textTwo is still @"Strawberry"

因爲執行someObject.text = m時,實際上是把指針指向了m所指向的對象,所以m和someObject.text指針指向同一個對象。

而someObject.textTwo則是先將m中的對象copy了一份,然後再指向這個copy,所以並不會因爲m變化而變化。

注意上文說的copy特性,是建立一個索引爲1的對象。


4. 如果是新手,實在要用strong特性來申請NSString。那必須注意以下代碼

someObject.text = [[NSString alloc] initWithString:m];
//這行代碼的意思就是申請一個新的NSString指針,然後指向一個string值和m值相同的對象。類似copy特性


四、總結

(在ARC環境下)

  1. 對基礎數據類型 (例如NSInteger,CGFloat)和C數據類型(int, float, double, char, 等)適合用assign特性
  2. 對於NS開頭,UI開頭的對象引用 比如(NSMutableArray *,NSMutableDictionary * ,NSMutableString *,UIImage *, UIColor *等)可以用strong特性
  3. 對於NSArray、NSDictionary、NSString最好用copy類型。
  4. 對UI控件的引用,iOS會自動將其設置爲弱變量(weak)。

發佈了37 篇原創文章 · 獲贊 7 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章