2011-03-19 164 views
0

我想解釋下面的這個崩潰日誌,但我不確定是否正確理解它。 objc_msgSend()表示我正在發送消息給已經處理的東西。所以基本上數據源在tableview可以繪製其單元格之前消失?解釋崩潰日誌目標C

我怎樣才能找到這個問題的原因?我試過使用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 

回答

2

這是內存管理錯誤的典型症狀。 NSTableView嘗試訪問某些數據塊(可能是對象的值或物品或東西嗎?)已被釋放,但將實現代碼如下仍引用。

有幾個方法來解決這個問題:

  • 運行您的代碼靜態分析。這將發現任何明顯的泄漏
  • 使用儀器運行您的代碼,特別是打開殭屍工具。這將跟蹤您何時嘗試將消息發送到已被釋放的對象。它還將包括噸的有用信息,如創建對象,何時何地被保留,釋放和自動釋放,最後它被釋放的時間和地點
+0

這裏的問題:它只有崩潰某些機器上,並排除地雷。 '和它檢測到該陣列是nil,它之前將它傳遞給tableview中創建它:提供動力的的tableview陣列,當所述的tableview調用'objectValueForTableColumn的方式受到保護。除了'dealloc',我不會在任何地方釋放它們。 – Pripyat 2011-03-19 08:50:33

+0

我懷疑這是過度發佈的對象價值 - 更可能是數據源本身。 – 2012-11-11 02:46:33