didReceiveMemoryWarning 后 iOS UITableView 空白

标签 ios cocoa-touch uitableview didreceivememorywarning

我在这里有点不知所措,我希望有人能指出我哪里做错了。

我的应用程序是用于 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:]: row (0) beyond bounds (0) for section (0).'

那么是什么给了?如果我的 tableView 的内存在内存警告期间被完全删除,为什么不将它设置为 nil?另外,如何重新构建它?

最佳答案

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

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

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

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

问候语 马库斯

关于didReceiveMemoryWarning 后 iOS UITableView 空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8690721/

相关文章:

iphone - 为什么更改 CAGradientLayer 的值会导致 "automatic"动画?我该如何避免呢?

ios - icloud核心数据同步

ios - UITableView - 部分标题。如何更改文本?

ios - UIView 没有名为“delegate”的成员

ios - 在表格 View 中第二次按下按钮时反转动画

ios6 - numberOfRowsInSection 不为自定义 tableviewcell、委托(delegate)/数据源集运行

ios - 在没有许可和 ERROR ITMS-90121 之间提交的循环错误

ios - iOS 应用程序可以包含动态库吗?

objective-c - 将调度信号量与委托(delegate)方法一起使用

iphone - NSTimers 在后台运行?