2011-08-25 88 views
5

我有一個方法返回CGPath並生成分析器警告。該方法在協議中聲明。這裏是生成警告的示例實現:我應該如何避免這種內存警告?

「分配上線47和存儲到‘路徑’的物體的潛在的泄漏」:

- (CGPathRef)createPathForBounds:(CGRect)bounds key:(NSString *)key; 
{ 
    if ([key isEqualToString:OvalColumn]) 
    { 
     CGPathRef path = CGPathCreateWithEllipseInRect(bounds, NULL); 
     return path; 
    } 

    return NULL; 
} 

下面是示例性的使用是生成的警告,「這不是在這一點上調用者所擁有的對象的引用計數錯誤減量」

CGPathRef path = [self.delegate createPathForBounds:bounds key:someKey]; 

// Use the path to do some drawing 

CGRelease(path); 

我的內存管理是correc噸;我從協議方法中傳回一個保留的CGPath,並在調用塊中釋放它,所以我知道警告可以被忽略,但我想完全刪除它們。

我錯過了一個命名約定,它會使分析器快樂嗎? 函數可以在協議中定義嗎? 子類化將如何工作?

+1

你可能會透露一下你得到的警告的措辭,或者我們必須猜測嗎? –

+0

我的歉意。更新。 – kubi

+0

如果將方法重命名爲pathForBounds:key,會發生什麼情況? –

回答

5

- (CGPathRef)newPathForBounds:(CGRect)bounds key:(NSString *)key

關於這一主題的詳細筆記可以發現here

或者,你可以選擇使用屬性cf_returns_retained,但它是最好的(IMO)有利於命名約定。

+0

美麗。事後看來很明顯。 – kubi

+0

我不知道他爲什麼被拒絕投票。這絕對是正確的答案。分析儀正在使用方法命名約定。將名稱更改爲「newPathForBounds」會告訴分析器(以及任何使用它的開發人員)該方法正在執行的操作 - 並且您應該期望保留的對象能夠吐出另一端。 – Steve

+0

我只是假定返回Foundation對象的方法必須使用基礎命名約定。我也不知道爲什麼會得到反對票。 – kubi