Iphone DID接收内存警告、查看DID卸载和解除锁定
我已经浏览了很多帖子,我的书和苹果开发者,并且收集了我需要的关于使用它们的大部分理解。如果有好心人能证实我做得对(或纠正我),并回答这两个问题,我将不胜感激 非常感谢, 克里斯 消息的顺序 通常,消息将按以下顺序显示:Iphone DID接收内存警告、查看DID卸载和解除锁定,iphone,memory-management,uiviewcontroller,Iphone,Memory Management,Uiviewcontroller,我已经浏览了很多帖子,我的书和苹果开发者,并且收集了我需要的关于使用它们的大部分理解。如果有好心人能证实我做得对(或纠正我),并回答这两个问题,我将不胜感激 非常感谢, 克里斯 消息的顺序 通常,消息将按以下顺序显示: 我收到了记忆警告 viewDidUnload(可能由1引起)-显然只适用于视图控制器类 解除锁定 没有收到记忆警告 当系统内存不足时调用 默认情况下,视图控制器注册为内存警告通知,在模板方法中,如果没有superview,则调用[super didReceiveMemoryW
- 我收到了记忆警告
- viewDidUnload(可能由1引起)-显然只适用于视图控制器类
- 解除锁定
问题2-弹出视图是否会将其从内存中删除?一些更正和建议:
实践确实收到了记忆警告
didReceiveMemoryWarning
会在“安全的情况下”释放其视图。虽然从苹果的文档中还不清楚“这样做安全”是什么意思,但人们普遍认为它没有superview(因此当前无法看到该视图),而且它的loadView
方法可以毫无问题地重建整个视图
覆盖didReceiveMemoryWarning
时的最佳实践是,根本不要尝试释放任何视图对象。如果不再需要,只需释放自定义数据。关于视图,只需让超类的实现来处理它们
然而,有时数据的必要性可能取决于您的视图状态。在大多数情况下,这些自定义数据是在viewDidLoad
方法中设置的。在这些情况下,“安全释放自定义数据”意味着您知道在视图控制器再次使用自定义数据之前将调用loadView
和viewDidLoad
因此,在您的didReceiveMemoryWarning
中,首先调用超类实现,如果其视图已卸载,则释放自定义数据,因为您知道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
假定某人需要该视图,并将立即再次加载该视图
方法viewDidUnload
viewDidUnload
在视图控制器由于内存警告而卸载视图时调用。例如,如果从superview中删除视图,并将控制器的view
属性设置为nil
,viewDidUnload
方法将被调用。微妙的一点是,即使在控制器接收到didReceiveMemoryWarning
时视图控制器的视图已经被释放并设置为零,那么实际上控制器没有要卸载的视图,如果调用超类的didReceiveMemoryWarning
实现,则将调用viewDidUnload
这就是为什么手动将视图控制器的view
属性设置为nil不是一个好的做法。如果这样做,您最好也发送一条viewDidUnload
消息。我想您对viewDidUnload
的理解更可取,但显然这不是当前的行为
- 弹出视图控制器
viewDidUnload
这次将不被调用
- 其他