導語:
在初學iOS的時候,不明白property中屬性有什麼作用,比如strong, weak, assign, retain, copy等特性。
一、 Objective-C程序員的基本內存管理模型有三種
- 自動垃圾收集(現在Apple不建議使用垃圾收集,建議使用ARC進行代替)
- 手動引用計數和自動釋放池
- 自動引用計數(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)
- 強變量(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環境下)
- 對基礎數據類型 (例如NSInteger,CGFloat)和C數據類型(int, float, double, char, 等)適合用assign特性
- 對於NS開頭,UI開頭的對象引用 比如(NSMutableArray *,NSMutableDictionary * ,NSMutableString *,UIImage *, UIColor *等)可以用strong特性
- 對於NSArray、NSDictionary、NSString最好用copy類型。
- 對UI控件的引用,iOS會自動將其設置爲弱變量(weak)。