-1

我收到这两种方法的内存泄漏警告。第二个调用第一个,显然它的内存泄漏。有任何想法吗?

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:我刚刚完全更改了代码并删除了临时文件并清理了解决方案,这就是我所看到的 - 它正在寻找甚至没有代码的错误

在此处输入图像描述

4

3 回答 3

2

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

编辑:(以防止未来的反对票)既然您编辑了您的问题和代码,使其不再错误地返回一个保留的对象,之前的语句不再有效。是的,Xcode 在“甚至没有代码”的地方显示了关于内存泄漏的通知,这很奇怪。是的,也许是编译器错误。尽管如此,一个临时的(在我看来,完全有效的)解决方法是简单地使用定义而不是函数。如果你写这个,让我们看看 Xcode 会说什么:

#define SUBTREE_BORDER_COLOR [UIColor colorWithRed:0.0f green:0.5f blue:0.0f alpha:1.0f]
于 2012-10-01T14:24:10.030 回答
0

如果您想按原样使用“保留”,您还需要“释放”UIColor您从“ subtreeBorderColor”方法返回的“”对象。

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

于 2012-10-01T14:23:59.757 回答
-1

以前的两个答案都是正确的

但是,如果出于任何原因您需要保留方法返回的对象,请遵循规则并以“new”(或 alloc、retain 或 copy)开头重命名您的方法,这样每个人(以及您)都会知道返回的对象被保留,因此调用代码知道它有责任稍后在需要时释放它......

于 2012-10-01T14:30:07.017 回答