gpt4 book ai didi

objective-c - 在 viewDidUnload 中释放多少

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:42 25 4
gpt4 key购买 nike

Apple 模板在 viewDidUnload 中提供了这条评论:


//释放主视图的所有保留 subview 。
//例如self.myOutlet = nil;

所以我通常在 viewDidUnload 中将 IB Outlets 设置为 nil,然后在 dealloc 中释放它们。问题是,我其他所有保留的ivar对象,有的是编程添加的 View ,有的是数据模型,是不是也应该在这两种方法中处理?如果不是,为什么不呢?

来自这个答案here我收集到只有与 View 相关的对象应该作为 =nil 语句进入 viewDidUnload ,这应该可能包括非 IB Outlet 保留 View ,正确?然后,所有其他对象,包括数据模型,都应该作为 release 语句进入 dealloc。这是正常做法吗?

最佳答案

viewDidUnload 由于内存不足而被调用,以卸载当前不可见的 View Controller 的 View 。此时, View Controller 的 View 对象已被释放,这意味着作为 viewController.view 的 subview 的所有对象都已被释放,但如果您将它们保留在 ivar 中,则它们不会被释放。

您应该释放任何将在再次加载 View 时重新创建的对象,或者您可以根据需要轻松重新创建的对象。下次使用该 View 时,将从 NIB 或通过调用 loadView 重新创建 View ,以便重新创建您释放的所有内容。

当您的 View 来自 NIB 时,所有在 NIB 中指定的 View 对象都被创建并添加为 View Controller View 的 subview 。任何具有 IBOutlets 的 ivars 也连接到这些 subview ,因此您也“拥有”这些对象(您对它们有保留)。您需要释放这些 ivar,以便它们真正得到释放。

当您的 View 在 loadView 中以编程方式创建时,您还应该释放由 ivars 保留的那些对象,这些对象将在下次加载 View 时在 loadView 中重新创建。

同样适用于您在 viewDidLoad(或 viewWillAppear 或其他地方)中创建的任何内容,例如数据模型,如果您可以在稍后再次加载 View 或需要对象时“轻松”地重新创建它,那么它应该在 viewDidLoad 中释放到减少内存使用。实际上对于非 View 项目,比如数据模型,我会改为在 didReceiveMemoryWarning 中发布它。

使用 setter 将 nil 分配给保留的属性会导致向它们发送释放,当您编写 self.myOutlet = nil 时,您正在调用 setter 方法,该方法的实现如下:

-(void)setMyOutlet:(id)newObject
{
[newObject retain]; // does nothing if newObject is nil
[myOutlet release];
myOutlet = newObject;
}

关于objective-c - 在 viewDidUnload 中释放多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7196857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com