2011-05-01 44 views
0

我有一個UITableView其中numberOfSectionsInTableView和numberOfRowsInSection被調用兩次,第二次運行的範圍問題。如果我掩蓋了這個問題,我在第一次運行cellForRowAtIndexPath時遇到了一個範圍問題。表視圖數據源運行兩次,作用域問題

大部分數據全部來自在viewDidLoad期間配置的NSDictionary。我也有一個NSArray在同一時間配置。一旦設定,它們不會被更改或釋放。

當第一次調用numberOfSectionsInTableView時,沒關係。根據需要計算元素等,然後立即調用第二次(不知道爲什麼)。在第二次運行時,它無法訪問NSDictionary或NSArray項目。即使在嘗試NSLog時也會崩潰。例如:

NSLog(@"theMainDictionary %@",theMainDictionary); 

通常會導致EXC_BAD_ADDRESS但有時這樣的事情:

theMainDictionary <_UITableViewSeparatorView: 0x4e73680; frame = (0 307; 320 1); opaque = NO; autoresize = W; layer = <CALayer: 0x4e4bf20>> 

同樣,這同一條線路運行正常(登錄預期字典)第一次運行通過。

如果我通過返回一個固定的NSInteger來掩蓋問題,numberOfRowsInSection然後做同樣的事情。如果我屏蔽numberOfRowsInSection,cellForRowAtIndexPath在第一次運行時崩潰。雖然同樣的問題 - 無法訪問MainDictionary或相關的NSArray。

我不明白爲什麼他們運行兩次 - 沒有reloadData任何地方。我也不知道爲什麼第二個電話的運行方式不同。任何幫助非常感謝。

+0

你能展示整個.m文件的代碼嗎? – 2011-05-01 02:41:37

回答

0

您可能正在使用[NSDictionary dictionary]或幾個類似的工廠方法之一(它會返回一個autoreleased實例)創建您的字典,然後直接將其保存到伊娃而不保留它。它會正常工作,直到你的程序回到主運行循環,此時autorelease將解析並釋放對象。

有幾種方法來解決這個問題:

  • 分配到財產申報retain,而不是伊娃。這意味着self.theMainDictionary而不僅僅是theMainDictionary。這將保留給你,所以它會堅持下去,直到你釋放它(或分配一個不同的字典或nil屬性)。
  • 使用[[NSDictionary alloc] init](或許多其他init方法之一)而不是[NSDictionary dictionary]樣式。這會返回一個你擁有的實例,所以它會一直存在,直到你釋放它爲止。
  • 保存到ivar時,在字典上顯式調用retain。這取決於所有權,所以它會堅持到你釋放它爲止。

在任何情況下,都要記得在您的dealloc方法中釋放字典,否則內存將會泄漏。

以上所有可能也適用於該陣列。有關Cocoa中內存管理的更詳細說明,請參閱Apple's documentation

+0

呃 - 不敢相信我錯過了。它最初是一個財產,然後改爲伊娃來換取別的東西。忘記這一步,我一直在尋找瘋狂的原因。謝謝。 – 2011-05-01 03:26:15