仅限小牛队的EXC_BAD_ACCESS [NSTableView _dataSourceValueForColumn:row:]

时间:2015-04-13 08:09:59

标签: objective-c cocoa nstableview appkit

我的应用程序中,Mavericks上的用户因为EXC_BAD_ACCESS异常而导致崩溃的事件越来越频繁。但是,我无法弄清楚为什么,我无法重现它。

知道我从下面的日志中得到什么见解? 表的数据源有问题吗?

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000024048904

VM Regions Near 0x24048904: 
MALLOC_LARGE 000000001a362000-000000001aa92000 [ 7360K] 
rw-/rwx SM=PRV 
--> 
__TEXT 0000000050000000-00000000502c5000 [ 2836K] 
r-x/rwx SM=COW 
/System/Library/Extensions/AMDRadeonX3000GLDriver.bundle/Contents/MacOS/AMDRadeonX3000GLDriver

Application Specific Information: 
objc_msgSend() selector name: count

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libobjc.A.dylib 0x93b930ab objc_msgSend + 27 
1 com.apple.AppKit 0x970b6305 -[NSTableView 
_dataSourceValueForColumn:row:] + 69 
2 com.apple.AppKit 0x971ba127 -[NSTableView 
preparedCellAtColumn:row:] + 385 
3 com.apple.AppKit 0x971b9e25 -[NSTableView 
_drawContentsAtRow:column:withCellFrame:] + 50 
4 com.apple.AppKit 0x971b9bf2 -[NSTableView 
drawRow:clipRect:] + 1502 
5 com.apple.AppKit 0x971b94bf -[NSTableView 
drawRowIndexes:clipRect:] + 801 
6 com.apple.AppKit 0x9708cc94 -[NSTableView drawRect:] 
+ 1254 
7 com.apple.AppKit 0x97072194 -[NSView(NSInternal) 
_recursive:displayRectIgnoringOpacity:inGraphicsContext:CGContext:topView:shouldChangeFontReferenceColor:] 
+ 1174 
8 com.apple.AppKit 0x97071bec 
__46-[NSView(NSLayerKitGlue) drawLayer:inContext:]_block_invoke + 220 
9 com.apple.AppKit 0x97071971 -[NSView(NSLayerKitGlue) 
_drawViewBackingLayer:inContext:drawingHandler:] + 2237 
10 com.apple.AppKit 0x970710a8 -[NSView(NSLayerKitGlue) 
drawLayer:inContext:] + 116 
11 com.apple.AppKit 0x97071029 -[_NSViewBackingLayer 
drawInContext:] + 65 

1 个答案:

答案 0 :(得分:1)

原因可能是您仍然存储NSTableView dataSourcedelegate引用,如上面NSTableView.h中的属性setter和getter方法所述

  

dataSource是非垃圾收集应用程序中的弱引用(非保留)。在垃圾收集的应用程序下,它是一个强大的参考。

当您要使用包括表视图在内的所有子项破坏视图时,尝试调用一些特殊方法。

- (void)shutdown
{
  self.tableView.dataSource = nil;
  self.tableView.delegate = nil;
}