我在这里有点茫然,我希望有人能指出我错了。
我的应用程序是用于iPad的Master / View应用程序。
我的MasterView继承自UITableView,并且只要没有didReceiveMemoryWarning就可以正常工作。我有自定义单元格的内容,并且都可以用。到目前为止一切顺利,仅花费了几个小时就完成了构建。
但是,一旦我得到了didReceiveMemoryWarning,self.tableView似乎会表现得很奇怪。不再再次调用numberOfSectionsInTableView和tableView:numberOfRowsInSection:方法,并且当我的代码尝试选择第一个项目(在内存警告之后)时,如下所示:
[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]
animated:NO
scrollPosition:UITableViewScrollPositionMiddle];
它崩溃
-[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:]:第(0)节的行(0)超出范围(0)。
那有什么呢?如果在内存警告期间我的tableView的内存被完全擦除,为什么不将其设置为nil?另外,我该如何再次建立它?
最佳答案
您是否按代码实现每个接口构建器的表视图?当您使用self时,我假设您使用的是带有rest的属性。检查是否在viewDidUnLoad中将此值设置为nil,并在dealloc方法中释放字段指针。如果不是这样,问题就出在别的地方,但是我想你是这样做的,因为它的良好做法。
如果您是通过代码构建的tableview,并且在viewDidUnload中将该属性设置为nil,则在收到内存警告后必须再次分配它。要做的地方是viewDidLoad,initWith等...视图加载是大多数更好的选择,因为一旦您通过Nav-或TabBarController返回时,它就会被调用。
如果使用接口构建器,并且视图已加载到AppDelegate中(例如,在didFinishLaunchingWithOptions方法中),则除非再次调用awakeFromNib方法,否则将永远不会再次调用它。因此,在这种情况下,不要在viewDidUnload中将实例变量设置为nil。否则,您将失去指向接口构建器tableview的指针。这可能是原因,但实际上不应该这样做,因为IMO的做法不好。
如果您告诉我有关您代码的更多信息,我可以为您提供具体帮助。
问候
马库斯