2011-10-27 13 views
0

私はテーブルをリロードするために-reloadDataのみを使用していますが、何らかの理由でこの1つのテーブルをロードするたびにクラッシュします。これは、1つのアプリで多くのテーブルと同じビュー・コントローラのスーパークラスによって処理されるすべてのです:スタックトレースのステップのテーブルビューの再読み込みに関する奇妙なクラッシュ

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libobjc.A.dylib      0x321effbc objc_msgSend + 16 
1 UIKit        0x31abd9c4 -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 540 
2 UIKit        0x31abcaa2 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1070 
3 UIKit        0x31abc22c -[UITableView layoutSubviews] + 200 
4 UIKit        0x31a60d44 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 176 
5 CoreFoundation      0x36de4224 -[NSObject performSelector:withObject:] + 36 
6 QuartzCore       0x317ab37a -[CALayer layoutSublayers] + 210 
7 QuartzCore       0x317aaf92 CA::Layer::layout_if_needed(CA::Transaction*) + 210 
8 QuartzCore       0x317af114 CA::Context::commit_transaction(CA::Transaction*) + 220 
9 QuartzCore       0x317aee50 CA::Transaction::commit() + 308 
10 QuartzCore       0x317a6d7e CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 50 
11 CoreFoundation      0x36e59b44 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 12 
12 CoreFoundation      0x36e57d80 __CFRunLoopDoObservers + 252 
13 CoreFoundation      0x36e580da __CFRunLoopRun + 754 
14 CoreFoundation      0x36ddb4d6 CFRunLoopRunSpecific + 294 
15 CoreFoundation      0x36ddb39e CFRunLoopRunInMode + 98 
16 GraphicsServices     0x32ab6fe6 GSEventRunModal + 150 
17 UIKit        0x31a8b73c UIApplicationMain + 1084 

なしで直接私たちのコードからではないので、私は迷ってしまいました。なぜここでそれがクラッシュするのだろうか?

+0

いつテーブルをリロードしますか?たとえば、viewWillAppearearまたはいくつかのデータがダウンロードされた後など。 –

+0

-viewDidLoadでリロードしてから、「fetchedResultsControllerDidChangeContent」通知を受け取ったとき。 –

+0

NSZombieEnabled YESを設定して、リリースされたオブジェクトにアクセスしようとしているかどうかを確認してください。それは、テーブルビューのデータを再ロードすることに関連しないかもしれません。リリースされたオブジェクトにアクセスしようとすると、同様の問題が再現されます。 – 0x8badf00d

答えて

2

viewControllerのdeallocメソッドで、TableViewのデリゲートとデータソースがnilに設定されていることを確認してください。システムが破棄されたテーブルビューのCellForRowを呼び出そうとしたときと全く同じでした。

1

この同じトレースにnibを使用して行セルをインスタンス化しましたが、誤ってnibリファレンスからセルをインスタンス化していることがわかりました。私はテーブルのデータソースデリゲートにcellForRowAtIndexPathコールバックにそうようにセルをインスタンス化した

static NSString *CellIdentifier = @"CustomCellIdentifier"; 
CustomCell *cell = (CustomCell*)[aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 
    [self.cellNib instantiateWithOwner:self options:nil]; 
    cell = tmpCell; 
    self.tmpCell = nil; 
} 

私はcellNib作成のviewDidLoadで確認しました修正するには:

self.cellNib = [UINib nibWithNibName:@"CustomCellNib" bundle:nil]; 

そしてviewDidUnloadでは、殺します(これが最も重要なステップです):

self.cellNib = nil; 
関連する問題