我有一个基于导航的应用程序。屏幕列表有一个UITableView
带有书籍列表的列表。书籍列表位于NSArray
通过执行 HTTP 请求动态构建的属性中。当单击List中的某一行时,将导航到屏幕Details。假设此时有内存警告。当您回到屏幕List时,因为被调用,所以它NSArray
是 nil ,所以List将为空。viewDidUnload
处理这种情况的正确方法是什么?我不应该将 设置NSArray
为 nilviewDidUnload
吗?
我有一个基于导航的应用程序。屏幕列表有一个UITableView
带有书籍列表的列表。书籍列表位于NSArray
通过执行 HTTP 请求动态构建的属性中。当单击List中的某一行时,将导航到屏幕Details。假设此时有内存警告。当您回到屏幕List时,因为被调用,所以它NSArray
是 nil ,所以List将为空。viewDidUnload
处理这种情况的正确方法是什么?我不应该将 设置NSArray
为 nilviewDidUnload
吗?
通常你只会为你的 IBOutlet UI 元素清空属性。您还可以安全地清理任何可以在-viewDidLoad
. 但一般来说,这种方法只是为了清理和释放与视图相关的内存,而不是视图控制器。
正确的方法不是将数据存储在 UIViewController 中,而是存储在另一个管理数据的对象中。
视图控制器充当模型和屏幕之间的链接。您不应该使用它来存储您的数据。
通常我在 void dealloc() 中设置对象的 NS(Mutable)Array。Nil 和释放(如果对象不是自动释放的)。
如果你使用 uinavigationcontroller,视图是推送的,所以当你从你的详细视图返回时,通常你会有你之前的数据,除非你放入视图会出现刷新。
我的猜测是您在从 http 请求中释放内存时遇到问题。
如果您的数组是在 viewDidLoad 部分中构建的,那么您可以将其设置为 nil。当视图被调用时,它将被重建。
通常,您希望在 viewDidUnload 中将任何可以在 viewDidLoad 部分或 xib 文件中重建的内容设置为 nil。
我建议像这样懒惰地初始化 -
- (NSArray *)bookArray {
if (bookArray == nil) {
bookArray = [[NSArray alloc] init];
}
return bookArray;
}
然后在 viewDidLoad 中:
self.bookArray = [NSArray arrayWithOjects:...,nil];