1

我在这里有点茫然,我希望有人能指出我哪里出错了。

我的应用程序是适用于 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?另外我该如何重新构建它?

4

1 回答 1

1

您是否为每个代码实现了每个界面构建器的表格视图?当您使用 self 时,我假设您使用带有保留的属性。检查您是否在 viewDidUnLoad 中将此设置为 nil 并在您的 dealloc 方法中释放字段指针。如果不是问题出在其他地方,但我认为您这样做是因为它的良好做法。

如果您已经通过代码构建了 tableview,并且在 viewDidUnload 中将该属性设置为 nil,则在收到内存警告后必须再次分配它。这样做的地方是 viewDidLoad、initWith 等... View did load 通常是更好的选择,因为一旦你通过 Nav- 或 TabBarController 返回它就会被调用。

如果您使用界面构建器并且您的视图被加载到您的 AppDelegate 中(例如在 didFinishLaunchingWithOptions 方法中),则 awakeFromNib 方法将永远不会被再次调用,除非您再次调用它。因此,在这种情况下,不要在 viewDidUnload 中将实例变量设置为 nil。否则,您将失去指向界面构建器表视图的指针。这最后一部分可能是原因,但实际上它不应该是因为 IMO 它不是一个好习惯。

如果您告诉我更多关于您的代码的信息,我可以更具体地为您提供帮助。

问候马库斯

于 2012-01-01T12:18:05.630 回答