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