UIButton的子视图需要发布吗?

时间:2011-03-23 03:55:44

标签: objective-c uibutton release subview autorelease

第一次在这里问一个问题。

我有一个问题,我已将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];

2 个答案:

答案 0 :(得分:0)

简答:

您的代码似乎很好。基本的经验法则是,对于每个allocnewretaincopy,您需要releaseautorelease。< / p>


长答案:

让我们逐行完成您的代码。

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

第一行使用便捷方法。您不需要在任何内容上调用发布,因为您尚未调用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

答案 1 :(得分:0)

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

这同样适用于您的按钮。您尚未拨打allocretain(而是使用了buttonWithType),因此您无需在其上调用release