奇怪的崩溃与tableview重新加载有关

时间:2011-10-27 15:06:07

标签: iphone objective-c cocoa-touch uitableview

我只使用-reloadData重新加载我的表,但由于某种原因,每次加载这个表时它都会崩溃。这只是app中许多表中的一个,它们都由同一个视图控制器超类处理:

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

堆栈跟踪中的所有步骤都不是直接来自我们的代码,所以我迷路了。为什么会在这里崩溃?

2 个答案:

答案 0 :(得分:2)

确保在viewControllers的dealloc方法中将TableView的委托和数据源设置为nil。当系统试图调用CellForRow时,我就完全一样了....对于被销毁的tableview。

答案 1 :(得分: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;
}

要修复我在viewDidLoad中确定我创建了cellNib:

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

在viewDidUnload中,取消对它的引用(这是最重要的一步):

self.cellNib = nil;