我正在尝试解释下面的崩溃日志,但我不确定我是否理解正确。 objc_msgSend()
表示我正在向已经解除分配的内容发送消息。所以基本上数据源在tableview可以绘制其单元格之前消失了吗?
如何找到此问题的原因?我已经尝试使用atos
工具通过它返回的十六进制来查找崩溃的位置,但无济于事。
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000020
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Application Specific Information:
objc_msgSend() selector name: tableView:objectValueForTableColumn:row:
Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x93f89ed7 objc_msgSend + 23
1 com.apple.AppKit 0x936143ea -[NSTableView preparedCellAtColumn:row:] + 335
2 com.apple.AppKit 0x9362e8bc -[NSTableView _drawContentsAtRow:column:withCellFrame:] + 56
3 com.apple.AppKit 0x9362d92a -[NSTableView drawRow:clipRect:] + 1131
4 com.apple.AppKit 0x9362d362 -[NSTableView drawRowIndexes:clipRect:] + 360
5 com.apple.AppKit 0x9362bd3b -[NSTableView drawRect:] + 1144
6 com.apple.AppKit 0x936218fd -[NSView _drawRect:clip:] + 3721
7 com.apple.AppKit 0x9361efc9 -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 2217
8 com.apple.AppKit 0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668
9 com.apple.AppKit 0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668
10 com.apple.AppKit 0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668
11 com.apple.AppKit 0x9361f95c -[NSView _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 4668
12 com.apple.AppKit 0x9361e55b -[NSThemeFrame _recursiveDisplayRectIfNeededIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:topView:] + 265
13 com.apple.AppKit 0x9361aea2 -[NSView _displayRectIgnoringOpacity:isVisibleRect:rectIsVisibleRectForView:] + 3309
14 com.apple.AppKit 0x9357ba57 -[NSView displayIfNeeded] + 818
15 com.apple.AppKit 0x93544d40 -[NSWindow displayIfNeeded] + 204
16 com.apple.AppKit 0x9357628a _handleWindowNeedsDisplay + 696
17 com.apple.CoreFoundation 0x94f0ae02 __CFRunLoopDoObservers + 1186
18 com.apple.CoreFoundation 0x94ec6d8d __CFRunLoopRun + 557
19 com.apple.CoreFoundation 0x94ec6464 CFRunLoopRunSpecific + 452
20 com.apple.CoreFoundation 0x94ec6291 CFRunLoopRunInMode + 97
21 com.apple.HIToolbox 0x94188004 RunCurrentEventLoopInMode + 392
22 com.apple.HIToolbox 0x94187cf7 ReceiveNextEventCommon + 158
23 com.apple.HIToolbox 0x94187c40 BlockUntilNextEventMatchingListInMode + 81
24 com.apple.AppKit 0x9354c78d _DPSNextEvent + 847
25 com.apple.AppKit 0x9354bfce -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 156
26 com.apple.AppKit 0x9350e247 -[NSApplication run] + 821
27 com.apple.AppKit 0x935062d9 NSApplicationMain + 574
28 ...yapp.com 0x00003032 0x1000 + 8242
答案 0 :(得分:3)
Greg Parker是Objective-C运行时的工程师。他在objc_msgSend中解释崩溃的博客文章基本上是权威来源:http://www.sealiesoftware.com/blog/archive/2008/09/22/objc_explain_So_you_crashed_in_objc_msgSend.html。
简短的回答:你有一个内存腐败的bug。
答案 1 :(得分:2)
这是内存管理错误的典型症状。 NSTableView
试图访问已经解除分配的某些数据(可能是对象值或项目或其他内容?),但是tableview仍然引用。
有几种方法可以解决这个问题: