EXC_BAD_ACCESS [NSTableView _dataSourceValueForColumn:row:] 仅限 Mavericks
EXC_BAD_ACCESS [NSTableView _dataSourceValueForColumn:row:] in Mavericks only
Mavericks 上的用户越来越多地报告我的应用程序因 EXC_BAD_ACCESS 异常而导致崩溃。但是,我想不通为什么,也无法重现。
知道我可以从下面的日志中得到什么见解吗?
table 的数据源有问题吗?
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
原因可能是您仍在存储 NSTableView dataSource
或 delegate
引用,正如上面所说 NSTableView.h
中的属性 setter 和 getter 方法
The dataSource is a weak reference (non retained) in non garbage collected applications. Under garbage collected apps, it is a strong reference.
当您要破坏包含 table 视图的所有子视图时,请尝试调用一些特殊方法。
- (void)shutdown
{
self.tableView.dataSource = nil;
self.tableView.delegate = nil;
}
Mavericks 上的用户越来越多地报告我的应用程序因 EXC_BAD_ACCESS 异常而导致崩溃。但是,我想不通为什么,也无法重现。
知道我可以从下面的日志中得到什么见解吗? table 的数据源有问题吗?
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
原因可能是您仍在存储 NSTableView dataSource
或 delegate
引用,正如上面所说 NSTableView.h
中的属性 setter 和 getter 方法
The dataSource is a weak reference (non retained) in non garbage collected applications. Under garbage collected apps, it is a strong reference.
当您要破坏包含 table 视图的所有子视图时,请尝试调用一些特殊方法。
- (void)shutdown
{
self.tableView.dataSource = nil;
self.tableView.delegate = nil;
}