调用subtreebordercolor时对象的潜在泄漏

时间:2012-10-01 14:20:23

标签: iphone objective-c

我收到这两种方法的内存泄漏警告。第二个叫第一个,显然是泄漏的记忆。有什么想法吗?

static UIColor *subtreeBorderColor(void) 
{
    return [UIColor colorWithRed:0.0f green:0.5f blue:0.0f alpha:1.0f];
}


- (void) updateSubtreeBorder 
{
    CALayer *layer = [self layer];
    if (layer) {


        // If the enclosing TreeGraph has its "showsSubtreeFrames" debug feature enabled, 
        // configure the backing layer to draw its border programmatically.  This is much more efficient
        // than allocating a backing store for each SubtreeView's backing layer, only to stroke a simple
        // rectangle into that backing store.

        PSBaseTreeGraphView *treeGraph = [self enclosingTreeGraph];
        if ([treeGraph showsSubtreeFrames]) {
            [layer setBorderWidth:subtreeBorderWidth()];
            [layer setBorderColor:[subtreeBorderColor() CGColor]];

        } else {
            [layer setBorderWidth:0.0];
        }


    }
}

//3: Potential leak of an object
//6: Calling 'subtreeBorderColor'
//1: Entered call from 'updateSubtreeBorder'
//13: Method returns an Objective-C object with a +0 retain count
//12: Reference count incremented. The object now has a +1 retain count
//6: Returning from 'subtreeBorderColor'
//13: Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1

更新2:我刚刚完全更改了代码并删除了临时文件并清理了解决方案,这就是我所看到的 - 它在找不到代码时发现错误

enter image description here

3 个答案:

答案 0 :(得分:2)

简单。您不需要在函数中调用- retain。那是完全自动释放模式的发明。由于您没有使用alloc-init创建UIColor对象,因此您不会拥有它。无需进一步复杂化内存管理。 :)

编辑:(以防止将来的downvotes)现在您编辑了问题和代码,以便它不再错误地返回保留对象,之前的语句不再有效。是的,Xcode显示了关于“甚至没有代码”的内存泄漏的通知,这很奇怪。是的,也许是编译器错误。不过,暂时(在我看来,完全有效)的解决方法是简单地使用define而不是函数。如果你写这个,我们就看看Xcode说的是什么:

#define SUBTREE_BORDER_COLOR [UIColor colorWithRed:0.0f green:0.5f blue:0.0f alpha:1.0f]

答案 1 :(得分:0)

如果您希望以“保留”方式使用“保留”,则还需要“释放”从“UIColor”方法返回的“subtreeBorderColor”对象。

如果这是我的代码,我不会在该自动释放的对象上执行“retain”。或者更好,只需在启用ARC的情况下执行我的代码。

答案 2 :(得分:-1)

两个前面的答案都是对的

但是,如果由于任何原因你需要保留方法返回的对象,请遵循规则并重命名方法,以“new”开头(或分配或保留或复制),所以每个人(你也是)将知道返回的对象被保留,因此调用代码知道它有责任在以后需要时释放它...