我的Mac应用程序有一个NSOutlineView,其中包含要扩展数据的不同单元格。我正在使用这个功能:
(id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
以每个单元格的列显示数据。
仅在此功能中,我的应用程序崩溃。当行显示数据时会发生这种情况。一段代码是:
if (item)
{
NSLog(@"Passed first level");
//NSLog(@"Item is: %@", item); // CRASH POINT
if([item isKindOfClass:[NSDictionary class]]) // CRASH POINT
{
NSLog(@"Passed second level");
if([[tableColumn identifier] isEqualToString:@"columnA"])
{
NSLog(@"Column A");
outlineViewDataValue = [item valueForKey:@"columnA"];
}
and so on for other identifiers...
}
}
为每列的不同行调用此代码。但是,一旦两个或三个父节点被扩展,那么它就会在崩溃时爆炸,并显示“IT PASSED level one BUT not Pasted level two”。这非常令人惊讶,因为在验证数据之后,它在三行或四行正常工作之后发生。此外,如果尝试打印它的值,它会很好并打印,直到它遇到崩溃。即使它没有在项目对象中显示任何数据。
实现了其他必需的数据源函数,并且工作正常。此时的崩溃每次都只标记为CRASH POINT。
当我扩展多个单元格时,当我展开第三个单元格或第四个单元格时,它会崩溃。当只有一行要扩展时,就没有问题,我们可以一次又一次地扩展和关闭。
崩溃堆栈是:
#0 0x93efaedb in objc_msgSend
#1 0x0001b745 in -[MyViewController outlineView:objectValueForTableColumn:byItem:] at MyViewController.m:26
#2 0x91c76b19 in -[NSOutlineView _dataSourceValueForColumn:row:]
#3 0x91c765f2 in -[NSTableView preparedCellAtColumn:row:]
#4 0x91c90acc in -[NSTableView _drawContentsAtRow:column:withCellFrame:]
#5 0x91c90a3a in -[NSOutlineView _drawContentsAtRow:column:withCellFrame:]
#6 0x91c8fb3a in -[NSTableView drawRow:clipRect:]
#7 0x91c8f572 in -[NSTableView drawRowIndexes:clipRect:]
#8 0x91c8f3ff in -[NSOutlineView drawRowIndexes:clipRect:]
#9 0x91c8df4b in -[NSTableView drawRect:]
#10 0x91c83a36 in -[NSView _drawRect:clip:]
#11 0x91c826d4 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:]
#12 0x91c82a09 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:]
#13 0x91c82a09 in -[NSView _recursiveDisplayAllDirtyWithLockFocus:visRect:]
#14 0x91c80bf3 in -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:]
此外,id类型的item对象很好,并且在出现此问题之前是NSDictionary类型,并且它在调试期间仅显示id类型导致此问题。
请建议如何跟踪此崩溃,或确保展开和显示/获取数据的所有相关功能都能正常运行。