(iphone)uiimage,view,subviews memory management

时间:2011-02-04 05:01:45

标签: iphone memory-management view

我需要在需要时发布uiimage / view / subviews,并对发布它们的正确练习提出一些问题。

  1. [imageView removeFromSuperview]会发布imageView和imageView.image吗?

  2. view = nil;将递归发布其子视图/和相关的uiimages?如果没有,我应该实现递归函数来释放视图的子视图吗?

  3. 谢谢


    编辑。

    我查看了UIView的图书馆参考资料

    addSubview -

      

    此方法保留视图并设置其视图   接下来对接收器的响应者   是它的新超级视图。

    removeFromSuperview -

      

    如果接收者的超级视图不是   没有,超级视图发布了   接收器。如果您打算重用视图,   一定要在打电话之前保留它   这个方法稍后再发布   酌情。

    仍然不确定[imageView发布]是否会释放与之关联的uiImage, 我还需要递归发布子视图吗?即一个被取消分配的视图会自动保证它的子视图会被释放吗?

2 个答案:

答案 0 :(得分:1)

执行[imageView removeFromSuperview]时,它不会发布任何内容。之后你需要[imageView release]。即便如此,你仍然需要在imageView的dealloc中释放你的记忆。

答案 1 :(得分:1)

  

[imageView removeFromSuperview]会   发布imageView和   imageView.image?

removeSuperView calls release on the view,但你应该注意保留计数的意见。仅仅因为你调用removeFromSuperview并不意味着它正在做你想要的。

  

view = nil;会释放它   子视图/和相关的uiimages   递归?如果没有,我应该   实现递归函数   发布视图的子视图?

不,您可能想这样做(取决于您在创建过程中管理子视图的方式。如果superview是他们唯一的参考,他们可能会有一个保留计数为1,因此在调用removeFromSuperview后调用release会导致错误):

for (UIView* subview in view){
    [subview removeFromSuperView];
    [subview release]
}
[view release];

编辑:要回答你的最后一个问题,不,在视图上调用release不会自动调用其所有子视图的发布。您必须自己完成,无论是发布还是使用removeFromSuperview。