2013-06-25 158 views
3

我有一種方法可以創建一個返回CoreGraphics對象的實例 - CGPathRef抑制XCode分析器存儲到..的對象的潛在泄漏錯誤

當我通過分析器運行應用程序時,它抱怨說這種方法正在泄漏......這是,但它是故意的。我確實希望將所有權轉讓給呼叫者並讓他們清理乾淨。

我該怎麼做才能壓制這個分析儀警告?

- (CGPathRef) createSomePath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle 
{ 
    CGMutablePathRef slicePath = CGPathCreateMutable(); 

    .... 

    return slicePath; <--- Analyzer points to this line as a potential leak. 
} 

假設這應該是儘可能大量框架返回這些對象需要調用者進行清理......

提前感謝!

P.S.恐怕這個問題不是重複,也沒有在其他地方有適當的答案......在這個頁面頂部突出顯示的3個答案是不正確的/完整的......只有Matthias Bauch提供的答案即「新的「規則確實是我提出的問題的正確答案:)謝謝!

+0

我前一陣子做過;-) –

+0

@moonwalker這不是魔術; 'Create'是CF *命名法。 '+ new'是Objective-c的命名法。在Objective-C中'+ create'沒有任何意義。 – bbum

+0

@bbum - 當然我知道這是「創造規則」 - 魔法只是一種調子.. :) – Moonwalker

回答

9

CoreFoundation功能遵循"create rule"。如果函數中有「創建」,它將返回一個引用計數爲1的對象。

不幸的是,您的方法不是c函數。

所以你應該把你的Objective-C方法變成C函數。像這樣的:

CGPathRef CreatePath(CGPoint center, CGFloat innerRadius, CGFloat outerRadius, CGFloat startAngle, CGFloat endAngle) { 
    // your code here 
} 

這應該請分析儀和ARC工作正常。

在Objective-C方法中,您可以通過使用new, alloc, copy or mutableCopy啓動方法簽名來獲得類似的行爲。開始new的方法可能最適合您的情況。
像這樣的東西應該請分析儀,但我不確定它是否與ARC正常工作。你必須分析這個。

- (CGPathRef)newPath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle { 
    // your code here 
} 
+0

真棒 - newPath工作分析器。假設ARC不會有問題,但會一直關注它....謝謝你馬特。接受這個問題 – Moonwalker

+0

好的,簡單的答案。 –

0

你應該能夠做到這一點:

#ifndef __clang_analyzer__ 
CGMutablePathRef slicePath = CGPathCreateMutable(); 
#endif 

我不能說我推薦它,但!

+0

這是行不通的嗎?我只是自己測試它,它爲我工作。 – woz

+0

哦,對不起!我不確定它是誰。這隻有當你運行*產品>分析*? – woz

+0

是的......並且如果將#ifndef放置在賦值CGMutablePathRef的slicePath = CGPathCreateMutable();而不是返回它的工作...我已經投了你的答案表-1至0 ... :) – Moonwalker