2013-05-30 20 views
0

我有一個CFDictionaryRef不保留/釋放其對象。當我把它添加一個項目,我照顧其保留的,後來:__bridge_transfer和performSelector:withObject:

NSMutableArray *array = (__bridge_transfer NSMutableArray *)CFDictionaryGetValue(...) 
[self performSelector:someSelector withObject:array]; 

someSelector是一個變量保存一個選擇,我知道的。現在,第二行使得Xcode中告訴臭名昭著的警告:

PerformSelector可能會導致泄漏,因爲它的選擇是未知

這是否意味着我應該擔心ARC不知道如何爲管理內存array我剛剛轉讓所有權的變量?

+0

如果您使用ARC編譯'[self performSelector:@selector(someSelector)...]',您會發現許多問題和答案,因此「PerformSelector可能導致泄漏,因爲它的選擇器未知」解釋和解決方法來抑制警告。我很確定這個問題與使用'__bridge_transfer'無關。 –

+0

是的,我已經看到了大多數這些問題,並且我會盡可能使用變通辦法來壓制此警告。我的問題是,因爲這個警告只出現在用ARC編譯時出現,引用了可能的內存泄漏,並且由於'__bridge_transfer'的用途是讓ARC負責管理這個對象的內存,所以兩者有什麼關係? – matehat

+1

我強烈地認爲這是不相關的。如果我沒有記錯,「可能泄漏」是選擇器的*返回值*,而不是參數。 –

回答

0

從到this question接受的答案評論,似乎有人在蘋果公司已經證實了這一假設(引用答案本身):

事實上,有些時候,內存管理是聯繫在一起的方法的名稱按特定約定。具體來說,我正在考慮便捷的構造函數與make方法;前者按慣例返回自動放棄的對象;後者是保留的對象。約定基於選擇器的名稱,所以如果編譯器不知道選擇器,那麼它不能執行正確的內存管理規則。

因此,它無關的傳遞給performSelector:調用的參數可能的泄漏,而是它的返回值,它的Objective-C有沒有辦法知道,如果它是自動釋放與否的方式。這也是Martin R在評論中所假設的。

相關問題