我收到这两种方法的内存泄漏警告。第二个叫第一个,显然是泄漏的记忆。有什么想法吗?
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:我刚刚完全更改了代码并删除了临时文件并清理了解决方案,这就是我所看到的 - 它在找不到代码时发现错误
答案 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”开头(或分配或保留或复制),所以每个人(你也是)将知道返回的对象被保留,因此调用代码知道它有责任在以后需要时释放它...