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】:
简答:
您的代码看起来不错。基本的经验法则是,对于每个 alloc
、new
、retain
或 copy
,您需要一个 release
或 autorelease
。
长答案:
让我们逐行浏览您的代码。
UIImage *circleImage = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"item-circle" ofType: @"png"]];
第一行使用了一种方便的方法。你不需要在任何事情上调用 release,因为你还没有调用 alloc
、new
、retain
或 copy
。
UIImageView *circleImageView = [[[UIImageView alloc] initWithImage: circleImage] autorelease];
在第二行中,您调用alloc
,但随后您调用autoerelease
,这样就可以了。
[imageView setFrame: CGRectMake(-5, -5, 65, 65)];
同样,没有 alloc
、new
、retain
或 copy
。
UIButton *button = [UIButton buttonWithType: UIButtonTypeCustom];
再一次,您使用了一种方便的方法。
[button addSubview: circleImageView];
您还没有致电alloc
、new
、retain
或copy
。因此,您不要调用release
或autorelease
。
【讨论】:
感谢您的澄清 :) 非常感谢 :)【参考方案2】:作为一般规则,您alloc
或retain
自己的任何内容都需要发布。但是你在这里(本质上)通过调用autorelease
来做到这一点。如果你问是否需要再次释放子视图,答案是否定的。
这同样适用于您的按钮。您没有调用alloc
或retain
(而是使用了buttonWithType
),因此您无需调用release
。
【讨论】:
感谢您的回复:)以上是关于UIButton 的子视图需要释放吗?的主要内容,如果未能解决你的问题,请参考以下文章
UIButton 作为复杂 UIScrollView 上的子视图