你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發-retain/assign/strong/weak/copy/mutablecopy/autorelease區別

iOS開發-retain/assign/strong/weak/copy/mutablecopy/autorelease區別

編輯:IOS開發綜合
readwrite:是可讀可寫特性,需要生成getter和setter方法;
readonly是之都特性,只會生成getter方法,不會生成setter方法,不希望屬性在類外改變時候使用;
alloc 對象分配後引用計數為1retain 對象的引用計數+1

copy 一個對象變成新的對象(新內存地址) 引用計數為1 原來對象計數不變

assign:是賦值特性,setter方法將傳入參數賦值給實例變量(一把鑰匙,同進同出);用於基礎數據類型;
weak:由ARC引入的對象變量的屬性,比assign多了一個功能,對象消失後把指針置為nil,避免了野指針(不是null指針,是指向“垃圾”內存(不可用的內存)的指針);
retain:表示持有特性,setter方法將傳入參數先保留,後賦值(兩把鑰匙,各自進出),傳入參數的retaincount加1;
strong:ARC引入,等同於retain;
copy:表示賦值特性,setter方法將傳入對象復制一份;需要完全一個新的對象時候(兩套房子,兩把鑰匙);
nonatomic:非原子操作,決定編譯器生成setter和getter方法是否原子操作,不加同步,多線程訪問提高性能,
__unsafe_unretain:對象引用不會加1,對象釋放後,不會置為nil,可能造成野指針,盡量少用。
autorelease:對象引用計數-1 如果為0不馬上釋放,最近一個個pool時釋放


成員變量與屬性

實際情況並非上面那麼簡單,你可能需要在一個函數裡調用另一個函數分配的變量這時候有兩個選擇: 類成員變量和使用屬性

@interface TestMem: NSObject {
TestObject *m_testObject ; // 成員變量
TestObject *testObject; //成員變量
}
成員變量與上面的內存管理是一致的,只是在不同的函數裡要保持引用計數加減的平衡所以要你要每次分配的時候檢查是否上次已經分配了。是否還能調用
什麼時候用屬性?
1. 把成員做為public.
2. outlet 一般聲明為屬性( 這個內存於系統控制,但我們還是應該做一樣操作,後面會講)
3. 如果很多函數都需要改變這個對象 ,或這個函數會觸發很多次,建議使用屬性。我們看看屬性函數展開後是什麼樣子:


// assign
-(void)setTestObject :(id)newValue{
testObject= newValue;
}
// retain
-(void)setTestObject :(id)newValue{
if (testObject!= newValue) {
[testObject release];
testObject= [newValue retain];
}
}
// copy
-(void)setTestObject :(id)newValue{
if (testObject != newValue) {
[testObject release];
testObject = [newValue copy];
}
}


asssign 相於於指針賦值,不對引用計數進行操作,注意原對象不用了,一定要把這個設置為nil
retain 相當於對原對象的引用計數加1
copy 不對原對象的引用計數改變,生成一個新對象引用計數為1
注意:
self.testObject 左值調用的是setTestObject 方法. 右值為get方法,get 方法比較簡單不用說了
而 真接testObject 使用的是成員變量
self.testObject = [[testObject alloc] init]; // 錯 reatin 兩次
testObject = [NSArray objectbyindex:0]; //錯 不安全,沒有retain 後面release會出錯
如果testObject已有值也會mem leak

自動管理對象

IOS 提供了很多static(+) 創建對象的類方法,這些方面是靜態的,可以直接用類名
調用如:
NSString *testString = [NSString stringWithFormat:@"test" ];
testString 是自動管理的對象,你不用relese 他,他有一個很大的retain count, release後數字不變。


例外

有一些通過alloc 生成的對象相同是自動管理的如:
NSString *testString = [[NSString alloc] initWithString:@"test1"];
retain count 同樣是很大的數,沒辦法release
但為了代碼對應,還是應該加上[ testString release];

不然xcode的Analyze 會認識內存leak, 但Instruments leak 工具檢測是沒有的



學習的路上,與君共勉

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved