【问题标题】:(iphone) uiimage, view, subviews memory management(iphone) uiimage, view, subviews 内存管理
【发布时间】:2011-02-04 05:01:44
【问题描述】:

我需要在我需要的时候发布 uiimage/view/subviews,并且有一些关于发布它们的正确做法的问题。

  1. [imageView removeFromSuperview] 会释放 imageView 和 imageView.image?

  2. 视图 = 无;会递归地释放它的子视图/和相关的uiimages吗?如果没有,我应该实现一个递归函数来释放视图的子视图吗?

谢谢


编辑。

我查看了 UIView 的库参考

添加子视图 --

此方法保留视图并设置其 接收者的下一个响应者,它 是它的新superview。

removeFromSuperview --

如果接收者的superview不是 无,superview 发布 接收者。如果您打算重用视图, 打电话前一定要保留 这个方法,稍后再释放 视情况而定。

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

【问题讨论】:

    标签: iphone memory-management view


    【解决方案1】:

    [imageView removeFromSuperview] 会 释放 imageView 和 imageView.image?

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

    视图 = 无;将释放其 子视图/和相关的 uiimages 递归?如果没有,我应该 实现递归函数 释放视图的子视图?

    不,您可能想要这样做(取决于您在创建子视图期间如何管理子视图。如果超级视图是它们的唯一引用,则它们的保留计数可能为 1,因此在调用 removeFromSuperview 后调用 release 将导致一个错误):

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

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

    【讨论】:

    • 我说'释放'不是释放,我知道当它的保留计数变为零时内存将被释放。(我知道我必须处理所有其他引用)感谢递归子视图发布的澄清。我必须实现递归 removeFromsuperview(或释放)来释放视图子视图的所有后代。 :(
    • 是的,如果 imageView.image = nil 需要释放 uiImage 或者 [imageView release] 也会释放 imageView.image?
    • 您可以假设 UIImageView 在解除分配时释放其所有数据。在此之前,对 UIImageView 调用 release 不会对其数据调用 release。
    【解决方案2】:

    当您执行[imageView removeFromSuperview] 时,它不会释放任何东西。之后你需要[imageView release]。即便如此,您仍然需要将该视图的内存释放放在imageView 的dealloc 中。

    【讨论】:

    • 我认为 [parentView addSubview: childView] 保留 childView 而 [parent removeFromSuperview: childView] 释放 childView。这两个假设都是错误的?
    • 你可能是对的。我提到的方式是我一直认为的方式。看看有没有人说我错了。 :)
    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 2011-10-10
    • 2010-10-28
    相关资源
    最近更新 更多