2011-07-20 48 views
2

我加入由合作伙伴提供,以調用class_createInstance我的iOS項目代碼返回的對象,然後在返回之前調用autorelease,像這樣:分析錯誤時自動釋放呼籲通過class_createInstance

Class functionClass = objc_getClass(functionName); 
NSObject* functionObject = class_createInstance(functionClass, 0); 
[[functionObject performSelector:@selector(initWithDictionary:) withObject:msg] autorelease]; 

當運行分析Xcode的4.0.2,我得到的最後一行以下警告:

Object sent -autorelease too many times 

問題1:這怎麼對象獲取發送自動釋放過多多次?
我對class_createInstance的理解是我需要釋放它返回的值。

問題2:如果代碼是正確的,我該如何避免來自Analyze的警告?
我們有一個非常嚴格的政策,不檢查任何分析警告。

回答

1

這是一個非常奇怪的模式,因此,分析儀根本不知道它。使用class_createInstance()是非常罕見的。把我的頭頂部

兩個可能的解決方案:

  1. 使用預處理的標記告訴分析器,是的,其實,函數對象是保留引用(我沒有標記方便 - 您可以在發行說明或llvm.org網站上找到它或搜索系統標題)。

  2. 請勿使用class_createInstance()。一旦您參考了課程,只需使用+alloc即可。更好的是,將整個表達式重寫爲[[objc_getClass(functionName) alloc] initWithDictionary:msg]並完成它。

你也應該通過http://bugreporter.apple.com提交一個bug,儘管奇怪的是,靜態分析器不應該禁止這樣做。

+0

非常感謝。我選擇用類對象調用'alloc'並解決了這個問題。這是一個比他們之前做的更好的解決方案(它不是我的代碼)。我也向Apple提出了一個錯誤。 –

相關問題