2012-04-12 50 views
0

我已經從一個普通的工廠類以下的(簡化的)代碼:使用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。上述例子被簡化,並且在實際程序中,也有一些限制:

  1. 我不能註釋invokeSetup與ns_returns_retained,因爲它是繼承,並且存在其中invokeSetup返回0的引用其它子類。如果它是+1或+0,則只能在運行時檢測到。

  2. 我無法更改任何方法的名稱。

  3. 設計就是這樣。可能有更好的設計,但這不能在這裏改變。

是否有可能以某種方式告訴ARC在轉讓點(id replacement = ...)參考肯定是+1?

感謝, 約亨

+0

我知道你說這是一個例子,但爲什麼工廠模式試圖重新創建/替換'alloc&init'?爲什麼'init'有時會返回保留? 'alloc'應該只返回保留,否則創建時的某些對象會有其他2的保留計數。如果它是非ARC,那麼它會導致代碼看起來像'NSString * s = [@「test」newInstance] ; [釋放]; [釋放];'。儘管你無法改變它,但無論如何你可以避免它? – Joe 2012-04-12 14:59:59

+2

基本上,您提出的限制排除了所有可能的解決方案,對不起。實際上,我並不感到抱歉,這看起來像是一段非常糟糕的代碼。 – JeremyP 2012-04-12 15:10:52

回答

0

看到https://stackoverflow.com/a/5833430/1313031一種方式來抑制代碼

靜態分析警告但是,是的,做的最好的事情就是重命名的newInstance

+2

其實最好的做法是重寫代碼不要那麼糟糕。他有一個擁有不同所有權語義的方法,具體取決於正在使用哪個類或子類。用這個寫一個穩定的系統是沒有希望的。 – JeremyP 2012-04-12 15:29:05

+0

對不起。重命名只會讓生活變得更糟。這是弧線旨在防止的那種設計。如果你堅持使用這個代碼,那麼上面的鏈接或者-fno-objc-arc都會隱藏這些警告,但是你仍然會被這個設計所困住。 – 2012-04-12 15:45:19