我该如何避免这种记忆警告?

kub*_*ubi 5 memory-management objective-c naming-conventions

我有一个返回a CGPath并正在生成分析器警告的方法.该方法在协议中声明.以下是生成警告的示例实现:

"在第47行分配并存储到'path'中的对象的潜在泄漏":

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

    return NULL;
}
Run Code Online (Sandbox Code Playgroud)

以下是生成警告的示例用法,"调用者此时不拥有的对象的引用计数的不正确的减少"

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

// Use the path to do some drawing

CGRelease(path);
Run Code Online (Sandbox Code Playgroud)

我的记忆管理是正确的; 我CGPath从我的协议方法传回一个保留,我在调用块中释放它,所以我知道警告可以被忽略,但我想完全删除它们.

我错过了一个让分析仪满意的命名约定吗?可以在协议中定义函数吗?子类化将如何工作?

jus*_*tin 5

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

有关该主题的详细说明可在此处找到

或者,您可以选择使用该属性cf_returns_retained,但最好(imo)支持命名约定.

  • 对于将来找到这个主题的人,我想指出两个(单独的)文档:Cocoa命名约定 - http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/ Articles/mmRules.html(使用"new")和Core Foundation命名约定 - http://developer.apple.com/library/mac/#documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#// apple_ref/doc/uid/20001148-103029(使用"创建"). (2认同)