iPhone为什么我泄漏了一个物体?

时间:2011-03-09 11:00:41

标签: iphone memory uibutton memory-leaks

我正忙着使用iPhone应用程序。我已经阅读了很多关于内存管理的内容,我想我已经很好地覆盖了内存。但是,当我正在运行泄漏时,它告诉我,我正在泄漏记忆,尽管我认为不是。

以下代码:


UIButton * plus = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
[plus setTitle:@"+" forState:UIControlStateNormal];
[plus addTarget:self action:@selector(plusClicked:) forControlEvents:(UIControlEvents)UIControlEventTouchDown];
plus.frame = CGRectMake(x+35, y-30, 35, 30);
plus.tag = i;
[self.view addSubview: plus];
[plus release];

(x / y / i vars等......在上面定义,与此代码无关)。

根据乐器/泄漏,有人可以解释为什么我正在泄漏加号物体吗?

5 个答案:

答案 0 :(得分:1)

1)没有足够的信息可以确定,但我的猜测是因为您的控制器实例(或它的视图)正在泄漏,因为在[plus release]之后,此按钮的唯一所有者是控制器的视图。

2)您不必保留自动释放的对象以在本地范围内使用它们 - 它们可以保证在自动释放池耗尽之前(在您的情况下在事件处理结束时发生)。

答案 1 :(得分:1)

这一点代码保留了加号按钮三次。一旦创建按钮,一次显式,一次在addSubView :.

此代码还会自动释放加号按钮一次,然后释放一次。 (正如在其他答案中所提到的,显式的保留/释放调用是不必要的,但是平衡,所以不要导致泄漏。)要么你不平衡addSubView:中的保留与释放或自动释放池不倒掉。可能的解决方案是在释放包含视图之前向加号对象发送release(或可能是removeFromSuperview)消息。另一种可能的解决方案是在运行此代码时确保自动释放池处于活动状态。只是为了测试,您可以在代码之前添加NSAutoreleasePool,然后用以下内容排除池:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

// your code

[pool release];

如果这样做了,请检查代码的结构,找出自动释放池没有耗尽的原因。

答案 2 :(得分:0)

因为您没有分配该按钮(加按钮)。如果你没有分配那么你就不应该释放它。删除[加上释放];

答案 3 :(得分:0)

就在您发布的代码段中,它看起来不像是泄漏。如果按照makboney的建议删除释放行,则还必须在开头删除保留加号按钮。没有理由保留它,因为它是自动释放的,你显然不打算保留所有权的时间超过几行代码;)

尝试运行静态分析器(Build-> Analyze)可能会告诉您有关泄漏的更多信息。

答案 4 :(得分:0)

retain中删除UIButton * plus = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; 并删除 [plus release];