2011-08-25 93 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