2011-08-26 54 views
7

在標準的Objective-C手動內存管理,它在this question有人提出,釋放一個NSArray的方式初始化成使用在ARC下,我如何釋放NSArray中的元素?

imageArray = [[NSArray alloc] initWithObjects:[UIImage imageNamed:@"1.png"], 
         [UIImage imageNamed:@"2.png"], 
         nil]; 

是使用

[imageArray release]; 
imageArray = nil; 

由於我們不再可以使用-release在自動引用計數下,在ARC下發布此NSArray的建議方式是什麼?

+0

請給你的問題一些實際的內容,而不是隻是鏈接到另一個,並問「如何使用ARC做到這一點」 – BoltClock

+2

在ARC下,你不能只設置imageArray = nil;靜態分析器將決定是否發佈一個版本? – matthias

+0

可能重複[按鈕點擊清除圖像數組](http://stackoverflow.com/questions/3178039/clear-image-array-on-button-click) – Caleb

回答

12

如果imageArray是一個對象的ivar(可能不是一個安全的假設),你應該使用一個存取器來將數組設置爲nil;存取會照顧釋放陣列的所有成員:

[self setImageArray:nil];

如果您需要清理出許多成員的陣列,但保持一個有效的數組準備在伊娃讓其他的方法可以安全地發送郵件,可以使用以下命令:

[self setImageArray:[[NSArray alloc] init]];

將與一個新的空數組取代舊的陣列。

+1

說這是一個有點誤導,說你保持陣列。你不保留它,你用一個新的空數組替換它。 – Caleb

+0

確實;我會相應地編輯我的答案。 – matthias

+1

「如果imageArray是對象的ivar(可能不是一個安全的假設),則應該使用訪問器將數組設置爲nil;訪問者將負責釋放數組及其所有成員」一個ivar isn'與財產相同。每個屬性使用一個實例變量,但不是每個實例變量都使用一個屬性。另外,在ARC下,您不需要屬性即可獲得自動釋放。只需將ivar設置爲'nil'(即:'imageArray = nil'),編譯器就可以完成這項工作。 ;-) –

19

要使用ARC,您只需刪除您的retainrelease消息,就是這樣。所以你擺脫你的數組是這樣的:

imageArray = nil; 

這工作並不因爲泄漏ARC下的編譯器自動插入必要retainrelease電話。