6

我的名字在類(不是實例)進行選擇,並使用它的返回值:「執行選擇器可能會導致泄漏」的選擇,當它泄漏?

id obj = [objClass performSelector:NSSelectorFromString(methodName) withObject:p1]; 

的選擇創建該類的一個新實例。我需要使用返回的實例。顯然我得到了通常的performSelector可能會導致泄漏,因爲它的選擇器是未知的警告,因爲這個項目是用ARC編譯的。

如果我理解正確(from the answers here等),在這種情況下,performSelector 導致泄漏(不糾正我,如果我錯了,那麼我可以只禁用警告,並用它做)。選擇器是這樣實現的:

+ (id) objectWithFile:(NSString*)p1 
{ 
    return [NSKeyedUnarchiver unarchiveObjectWithFile:p1]; 
} 

什麼是我的選擇,當我不得不從字符串中使用選擇和選擇創建並返回對象的新實例?

我認爲NSInvocation但它的getReturnValue方法要求我提供我自己分配的緩衝區,其中存儲返回值。我不確定這是否適用於ARC和類方法,或者我是否只需要__bridge_transfer將malloc'ed返回值緩衝區轉換爲id,這就是它的全部內容。

+0

我不明白爲什麼你會在你的情況下泄漏。 'objectWithFile:'返回一個自動釋放對象,因爲它不是一個alloc/copy/new方法。 –

+0

我不確定我是否理解正確。假設我返回[Object new]而不是unarchived對象,它也返回一個autorelease對象,但那會泄漏?或者,如果執行選擇器本身調用alloc,new或copy,只會發生泄漏**。 – LearnCocos2D

回答

5

objectWithFile:不是的方法「黃金,複製,初始化,mutableCopy和新家庭」 ,因此 在"Clang/ARC documentation"意義上的「非保留返回值」方法:

返回可保留對象類型但不返回保留值的方法或函數必須確保對象在返回邊界上仍然有效 。
...
在最糟糕的情況下,這可能涉及autorelease,但呼叫者必須 不會假定該值實際上在自動釋放池中。

所以不管你在這個方法裏面做什麼,調用者都不必釋放 返回的對象。

因此,我不認爲你的代碼中有內存泄漏。

+0

謝謝,這很有道理。也證實了我的觀察,因爲如果不是強大的參考資料,返回的對象將被釋放。 – LearnCocos2D