UIButton 的子视图需要释放吗?

Posted

技术标签:

【中文标题】UIButton 的子视图需要释放吗?【英文标题】:Subview of UIButton needs releasing? 【发布时间】:2011-03-23 03:55:43 【问题描述】:

第一次在这里提问。

我有一个问题,我有一个UIImageView 作为子视图添加到我的UIButton,它是使用buttonWithType: 声明的(这意味着我不必释放按钮吗?)但我仍然必须释放我的UIButton 的子视图吗?

代码位:

UIImage *circleImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"item-circle" ofType: @"png"]];
UIImageView *circleImageView = [[[UIImageView alloc] initWithImage: circleImage] autorelease];
[imageView setFrame: CGRectMake(-5, -5, 65, 65)];

UIButton *button = [UIButton buttonWithType: UIButtonTypeCustom];
[button addSubview: circleImageView];

【问题讨论】:

欢迎来到 ***!请记住将答案标记为正确,并注意提问的方式。 谢谢 :) 糟糕,我注意到我已经自动释放了 UIImageView,所以这样可以吗? 你的代码很好,circleImageView 将被button 保留,直到按钮被释放,但你不必担心它,因为你分配的唯一对象已被标记为无论如何自动释放。 【参考方案1】:

简答:

您的代码看起来不错。基本的经验法则是,对于每个 allocnewretaincopy,您需要一个 releaseautorelease


长答案:

让我们逐行浏览您的代码。

UIImage *circleImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle]  pathForResource: @"item-circle" ofType: @"png"]];

第一行使用了一种方便的方法。你不需要在任何事情上调用 release,因为你还没有调用 allocnewretaincopy

UIImageView *circleImageView = [[[UIImageView alloc] initWithImage: circleImage] autorelease];

在第二行中,您调用alloc,但随后您调用autoerelease,这样就可以了。

[imageView setFrame: CGRectMake(-5, -5, 65, 65)];

同样,没有 allocnewretaincopy

UIButton *button = [UIButton buttonWithType: UIButtonTypeCustom];

再一次,您使用了一种方便的方法。

[button addSubview: circleImageView];

您还没有致电allocnewretaincopy。因此,您不要调用releaseautorelease

【讨论】:

感谢您的澄清 :) 非常感谢 :)【参考方案2】:

作为一般规则,您allocretain 自己的任何内容都需要发布。但是你在这里(本质上)通过调用autorelease来做到这一点。如果你问是否需要再次释放子视图,答案是否定的。

这同样适用于您的按钮。您没有调用allocretain(而是使用了buttonWithType),因此您无需调用release

【讨论】:

感谢您的回复:)

以上是关于UIButton 的子视图需要释放吗?的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 作为复杂 UIScrollView 上的子视图

将按钮超级视图控制器添加到另一个视图控制器时,UIButton 目标无法识别

自动释放会隐藏 Instruments 中的泄漏吗?

访问 UIButton 的子视图控件

使用 UIButton 进行触摸检测

检测 UIButton 触摸子视图