2012-03-22 91 views
4

我已經啓用了靜態分析器,但它告訴我,在該執行路徑的末尾,該對象沒有被釋放,因此可能導致內存泄漏。然而,我將那個引用創建的對象傳遞給另一個將釋放它的類。我想知道是否有一個方法或關鍵字告訴編譯後我會發布這個對象。沉默關於釋放CGMutablePathRef對象的編譯器警告

我正在尋找類似自動釋放的東西。

順便說一下,我正在使用ARC。

我創建這樣的對象:

CGMutablePathRef pathRef = CGPathCreateMutable(); 

,並將它傳遞這樣的:

self.flowView.pathToDraw = pathRef; 

在我flowView類我有這樣的方法,將其釋放。

-(void) setPathToDraw:(CGMutablePathRef) newPath { 
    if(pathToDraw!=NULL) CGPathRelease(pathToDraw); 
    pathToDraw=newPath; 
    [self setNeedsDisplay]; 
} 

我已經嘗試過查看GCPath文檔,但我沒有運氣。

謝謝

回答

2

是的,有針對的擴展:

http://clang.llvm.org/docs/LanguageExtensions.html#objc_features

你可以宣佈你的方法爲:

- (void)setPathToDraw:(CGMutablePathRef) __attribute__((cf_consumed)) newPath 

然後鏘將認識到這一點(從調用點 - 失敗檢查你是否確實在定義中使用它)。

您需要確保每個定義此選擇器的選擇器都符合您爲選擇器(名稱)應用的屬性。

屬性是有風險的 - 我建議儘可能遵守慣例,並且在處理動態調度時要格外小心。 Here's an example using ARC where the compiler can get it wrong。如果編譯器弄錯了,那麼你也可能會做得很好,因爲你正在努力對付那些試圖幫助你的工具。

IIRC,consume是我用過的唯一屬性,我專門用靜態分派。

+1

謝謝,這工作。 – Pochi 2012-03-22 05:21:31

1

爲什麼不按照正常的保留/釋放約定?我不明白你希望獲得什麼。

一個多個呼叫保持和釋放將作任何明顯的性能差異,這將是理解得多給別人;誰有權讀取這些代碼。

CGMutablePathRef pathRef = CGPathCreateMutable(); 
self.flowView.pathToDraw = pathRef; 
CGPathRelease(pathRef); 

-(void) setPathToDraw:(CGMutablePathRef) newPath 
{ 
    if (pathToDraw != newPath) { 
     CGPathRelease(pathToDraw); 
     pathToDraw=CGPathRetain(newPath); 

     [self setNeedsDisplay]; 
    } 
} 

如果你堅持這樣做怪異的方式,另一種方法是use the cf_consumed attribute in your declaration。這解釋了分析儀,你正在做一些不尋常的事情。

+0

這是我嘗試的第一件事,但是如果我在那裏釋放它,運行時會出現內存訪問錯誤。 – Pochi 2012-03-22 05:15:42

+0

然後你可能會在代碼中的其他地方獲得另一個額外的版本。希望你找到它! – 2012-03-23 00:30:02