我已經從一個普通的工廠類以下的(簡化的)代碼:使用objc_msgSend時避免靜態分析器泄漏警告?
- (id) invokeSetup: (id) object {
// Just an example, subclasses delegate setup to a component that either returns +0 or +1 references
return objc_msgSend(object, @selector(init));
}
- (id) newInstance {
id object = objc_msgSend([NSString class], @selector(alloc));
id replacement = [self invokeSetup: object];
return replacement;
}
分析器產生在return replacement:
警告:
警告:對象與0保留計數返回到調用方預計+1(擁有)保留計數
我以某種方式需要告訴分析儀,由- invokeSetup
返回的引用是+1。上述例子被簡化,並且在實際程序中,也有一些限制:
我不能註釋
invokeSetup
與ns_returns_retained,因爲它是繼承,並且存在其中invokeSetup返回0的引用其它子類。如果它是+1或+0,則只能在運行時檢測到。我無法更改任何方法的名稱。
設計就是這樣。可能有更好的設計,但這不能在這裏改變。
是否有可能以某種方式告訴ARC在轉讓點(id replacement = ...
)參考肯定是+1?
感謝, 約亨
我知道你說這是一個例子,但爲什麼工廠模式試圖重新創建/替換'alloc&init'?爲什麼'init'有時會返回保留? 'alloc'應該只返回保留,否則創建時的某些對象會有其他2的保留計數。如果它是非ARC,那麼它會導致代碼看起來像'NSString * s = [@「test」newInstance] ; [釋放]; [釋放];'。儘管你無法改變它,但無論如何你可以避免它? – Joe 2012-04-12 14:59:59
基本上,您提出的限制排除了所有可能的解決方案,對不起。實際上,我並不感到抱歉,這看起來像是一段非常糟糕的代碼。 – JeremyP 2012-04-12 15:10:52