- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我浏览了很多帖子、我的书籍和 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
中。方法。在这些情况下,“可以安全地发布自定义数据”意味着您知道 loadView
和viewDidLoad
将在 View Controller 再次使用自定义数据之前调用。
因此,在您的didReceiveMemoryWarning
中,首先调用父类(super class)实现,如果其 View 被卸载,则释放自定义数据,因为您知道loadView
和viewDidLoad
肯定会再次被调用。例如,
- (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
的理解更可取,但显然这不是当前的行为。
如果您的意思是通过“弹出”来“从 super View 中删除”,它确实会减少 View 的保留计数,但不一定会释放它。
如果您的意思是从 UINavigationController 中弹出,它实际上会减少 View Controller 本身的保留计数。如果 View Controller 没有被另一个对象保留,它将被释放,最好是与其 View 一起释放。正如我所解释的,viewDidUnload
这次将不会被调用。
从技术上讲,保留计数可能不会降至零。该对象更有可能只是被释放而没有事先将计数设置为零。
只是为了确保,由于内存警告, View Controller 本身通常不会在默认行为下被释放。
关于iphone - didReceiveMemoryWarning、viewDidUnload 和 dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5069978/
模板似乎创建了 [super viewDidUnload] 但代码示例显示: [super dealloc] 有区别吗? 最佳答案 您应该只调用父类(super class)的 -viewDidUnl
我的问题是这样的: 父类加载 subview 。 子级在执行操作期间使用“removeFromSuperView”删除自身。 当子类被移除时,父类会获得委托(delegate)调用,从而使子对象为零。
也许这是一个不好的做法,但从我阅读的文档中,我得到了在某些情况下在 viewDidLoad 方法内初始化对象并在 viewDidUnload 中将其置零的建议。 例如,如果您有添加观察者之类的内容 [
我知道以前有人问过类似的问题。但是我已经搜索了一段时间了,事情仍然有些困惑。所以这里... 我没有使用 ARC。 如果您有一个带有实例变量和如下属性的 View Controller : View C
我在读一本书,它建议将我的 IBOutlets 声明为 weak 应该可以解决当我的应用程序收到内存不足警告时的问题。例如,我现在不再需要在 viewDidUnload 方法中将这些 socket 设
viewDidUnload 的最佳实践是什么?仅将 IBOutlets 设置为 nil 还是将每个实例变量也设置为 nil(之前释放)? 提前致谢。 最佳答案 在设置为 nil 之前释放实例变量。不过
在我的应用程序中,我有一个 UIImagePicker,它不断抛出内存警告级别 1(最低)。然后它不断搞乱我的应用程序,因为它正在调用 viewdidunload 或 viewwillunload。当
我正在尝试禁用选项卡栏上除第一个选项卡之外的所有选项卡。我想出了这段代码: -(void)disableMainTabBar{ [self setSelectedIndex:0];
我试图弄清楚如何挂接到控件的 super View 上的ViewDidUnload。为了说明我为什么需要这个,请考虑我的 ControlFactory 类,它生成 UIButton(以及其他控件):
我一直在阅读“iPhone 4 开发入门”一书,他们有一个使用导航 Controller 的教程。在本教程中,我们将 View Controller (名为 childController)推送到 V
注意:我看到前面有人问了几个问题,但似乎没有一个能澄清我的疑问。 在 iOS6 之前,所有 socket ,图像和声音等大量资源在 viewDidUnload 中设置为 nil。在 iOS6 之后,情
如果我有一个 viewController 设置如下: @interface MapViewController : UIViewController { CLLocationManager
我是 iPhone 开发新手。 我在我的应用程序中使用一些按钮和标签。我将在 dealloc 函数中释放所有这些按钮和标签。 我也在 viewDidUnload 中释放它们。 - (void)view
摘自 Apple 的 View Controller 编程指南/高效管理内存; didReceiveMemoryWarning Use this method to deallocate all no
我倾向于在 -dealloc 中释放我的东西,现在 iPhone OS 3.0 引入了这个有趣的 -viewDidUnload 方法,他们说: // Release any retained subv
注意:此问题已过时 - viewDidUnload 已在 iOS 6 中弃用。 什么时候UIViewController的viewDidUnload会自动被调用?是的,我知道,当 View 卸载时。但
我刚刚安装了新版本的Xcode/ios6。 viewDidUnload 现已弃用。 在苹果文档中, viewDidUnload [...] Deprecated in iOS 6.0. Views a
当我移动到另一个 View 时,我可以使用哪种方法来捕获事件? 到目前为止我尝试过但没有成功的方法:viewWillDisappear: , willMoveToParentViewControlle
我一直在开发一个应用程序,我读的书说将这些语句放入 viewDidUnload 和 dealloc 方法中。还有什么其他信息应该放在这里?我的程序中有按钮和标签。我需要为他们做些什么吗? 我想要一个高
我遇到了一个非常有趣的情况,不知道如何解决它。我将首先概述我的程序的体系结构。我有一个 UITableViewController 派生类,它也实现了我的委托(delegate)协议(protocol
我是一名优秀的程序员,十分优秀!