gpt4 book ai didi

iphone - didReceiveMemoryWarning、viewDidUnload 和 dealloc

转载 作者:行者123 更新时间:2023-12-03 18:20:41 26 4
gpt4 key购买 nike

我浏览了很多帖子、我的书籍和 Apple Developer,并收集了使用这些内容所需的大部分理解。如果有好心人能够确认我的理解是正确的(或者纠正我)并回答这两个问题,我将不胜感激。

非常感谢,

克里斯。

消息顺序一般来说,消息将按以下顺序出现:

  • didReceiveMemoryWarning

  • viewDidUnload(可能由 1 引起)- 显然仅适用于 View Controller 类。

  • 释放分配

didReceiveMemoryWarning

当系统内存不足时调用。

默认情况下, View Controller 会注册内存警告通知,并且在模板方法中,如果 View 没有 super View ,则调用 [super didReceiveMemoryWarning] 会释放该 View ,这是检查 View 是否可见的一种方法或不。它通过将其属性设置为 nil 来释放 View 。

操作 - 释放您不需要的任何内容,可能会撤消您在 viewDidLoad 中设置的内容。不要释放 UI 元素,因为这些元素应该由 viewDidUnload 释放。

问题1 - 即使 View 可见,它似乎也会被调用,因此很难看到可以安全释放的内容。了解这一点以及一些可以发布的示例将非常有帮助。

viewDidUnload

每当不可见 View Controller 的 View 属性设置为 nil 时调用,无论是手动设置还是最常见的是通过 didReceiveMemoryWarning 设置。

有了 viewDidUnload 方法,您可以:- 清理您想要的任何其他内容,以节省额外的内存或- 如果您保留了一些 IBOutlet,以帮助释放正在卸载的 View 不会释放的内存。

操作 - 通常,您在 dealloc 中释放的任何 IBOutlet 也应该在此方法中释放(并将引用设置为 nil)。请注意,如果属性设置为保留,那么将它们设置为 nil 也会释放它们。

释放分配

当 View Controller 对象被取消分配时调用,当保留计数降至零时将调用。

操作 - 释放类所保留的所有对象,包括但不限于具有保留或副本的所有属性。

弹出 View Controller 和内存

问题 2 - 弹出 View 会将其从内存中删除吗?

最佳答案

一些更正和建议:

  • didReceiveMemoryWarning实践

正如你所说, Controller 的默认实现 didReceiveMemoryWarning如果“这样做是安全的”,则发布其观点。虽然从苹果的文档中并不清楚“安全这样做”的含义,但人们普遍认为它没有 super View (因此该 View 当前不可能可见),并且它的 loadView方法可以毫无问题地重建整个 View 。

覆盖 didReceiveMemoryWarning 时的最佳实践也就是说,根本不要尝试释放任何 View 对象。如果不再需要,只需释放您的自定义数据即可。关于 View ,只需让父类(super class)的实现来处理它们即可。

但是,有时,数据的必要性可能取决于您的 View 状态。在大多数情况下,这些自定义数据设置在viewDidLoad中。方法。在这些情况下,“可以安全地发布自定义数据”意味着您知道 loadViewviewDidLoad将在 View Controller 再次使用自定义数据之前调用。

因此,在您的didReceiveMemoryWarning中,首先调用父类(super class)实现,如果其 View 被卸载,则释放自定义数据,因为您知道loadViewviewDidLoad肯定会再次被调用。例如,

- (void)didReceiveMemoryWarning {
/* This is the view controller's method */
[super didReceiveMemoryWarning];
if (![self isViewLoaded]) {
/* release your custom data which will be rebuilt in loadView or viewDidLoad */
}
}

小心不要使用self.view == nil ,因为self.view假设某人需要该 View ,并将立即再次加载该 View 。

  • viewDidUnload方法

viewDidUnload View Controller 由于内存警告卸载 View 时调用。例如,如果您从 super View 中删除 View 并设置 view Controller 的属性为nil , viewDidUnload方法将不会被调用。一个微妙的点是,即使在 Controller 收到didReceiveMemoryWarning时 View Controller 的 View 已经被释放并设置为nil。 ,所以实际上 Controller 没有要卸载的 View ,viewDidUnload如果您调用父类(super class)的 didReceiveMemoryWarning 的实现,将会被调用.

这就是为什么手动设置 view 不是一个好的做法。 View Controller 的属性为零。如果您这样做,您最好发送 viewDidUnload消息也是如此。我猜你对viewDidUnload的理解更可取,但显然这不是当前的行为。

  • 弹出 View Controller

如果您的意思是通过“弹出”来“从 super View 中删除”,它确实会减少 View 的保留计数,但不一定会释放它。

如果您的意思是从 UINavigationController 中弹出,它实际上会减少 View Controller 本身的保留计数。如果 View Controller 没有被另一个对象保留,它将被释放,最好是与其 View 一起释放。正如我所解释的,viewDidUnload这次将不会被调用。

  • 其他...

从技术上讲,保留计数可能不会降至零。该对象更有可能只是被释放而没有事先将计数设置为零。

只是为了确保,由于内存警告, View Controller 本身通常不会在默认行为下被释放。

关于iphone - didReceiveMemoryWarning、viewDidUnload 和 dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069978/

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