2011-12-31 43 views
1

我在这里有点损失,我希望有人能指出我出错的地方。iOS之后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:]:行(0)超出区段(0)的边界(0)。'

那么是什么给?如果我的tableView的内存在内存警告期间被完全擦除,为什么它不被设置为零?另外我如何再次构建它?

回答

1

您是否在每个代码中实现每个接口构建器或oder的tableview?当你使用自我,我假设你使用保留属性。检查你的viewDidUnLoad中是否设置了这个值,并在dealloc方法中释放字段指针。如果问题不在其他地方,但我认为你这样做是因为它的良好做法。

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

如果您使用接口构建器并将视图加载到AppDelegate中(例如在didFinishLaunchingWithOptions方法中),则除非再次调用awakeFromNib方法,否则将不会再次调用awakeFromNib方法。所以不要在你的viewDidUnload中设置实例变量为nil。否则,你将失去指向界面生成器tableview的指针。这最后一部分可能是原因,但实际上它不应该是因为IMO它不是很好的做法。

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

Greetings Markus

+0

嗨马库斯,感谢您的写作。我很抱歉,我没有给出上下文:OSX 10.6.8,Xcode 4.2,项目使用ARC,目标是运行iOS 5.0.0的iPad 2。 – 2012-01-02 08:48:10

+0

问题原来是这个表的内容被烧毁,以及我指望要知道该放入表中的数组的内容。名为'docs'的数组''是'无',因此[docs count]返回'nil',而不是'0',所以当我到达selectRowAtIndexPath时,它肯定会炸毁,因为'nil'不是'0'行。 – 2012-01-02 08:50:37

+0

我觉得让一个'nil'对象接收一个消息而不会崩溃是ObjectiveC中的一个基本错误,因为它将返回对象的类型从int更改为nil。如果崩溃发生在[docs count]行上,我就会确切地知道问题出在哪里,而不是完全在另一种方法中。 – 2012-01-02 08:52:45