2011-12-31 76 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