2011-06-17 54 views
12

當我改變一些UILabel的框架時,我有一個神祕的EXC_BAD_ACCESS。碰撞是隨機的,通常我必須重複幾分鐘的條件。Crash in actionForLayer:forKey:

啓用NSZombies以及其他內存調試標誌(NSDebugEnabled,MallocStackLogging)沒有幫助,崩潰仍然不透明:僅在控制檯中沒有消息的BAD_ACCESS。目標似乎是正確的和活着的,所以它看起來不像是一個解除分配的內存問題。

爲了得到一些更多的信息,我的子類的UILabel和重寫了崩潰的功能:

@implementation TestUILabel 
- (id<CAAction>)actionForLayer:(CALayer *)layer forKey:(NSString *)event { 
    return [super actionForLayer:layer forKey:event]; 
} 
@end 

它崩潰的超類的方法,但在檢查一切似乎是正確的(印刷retainCount爲「自我」和「層」分別給3和2):

(GDB)PO自

< TestUILabel:0x6ac2800; baseClass = UILabel; frame =(173 174; 0 0);文字= '54平方米'; opaque = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = NO; 動畫= { position = < CABasicAnimation: 0xe07ba60>; };層= <的CALayer: 0xbf1b950 >>

(GDB)PO事件

界限

(GDB)PO層

<的CALayer:0xbf1b950; position = CGPoint(173 174);邊界= CGRect(0 0; 0 0);代表= < TestUILabel:0x6ac2800; baseClass = UILabel;幀=(173 174; 0 0);文字 = '54平方米'; opaque = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = NO; 動畫= { position = < CABasicAnimation: 0xe07ba60>; };層= < CALayer: 0xbf1b950 >>; contents = < CGImage 0xe04ed60>;不透明度= 1;動畫= [位置= < CABasicAnimation: 0xe07ba60>]>

是否有人得到了類似的問題?或者有什麼想法可能來自哪裏?

在此先感謝!

編輯: 這裏是完整的崩潰回溯:

線程1,隊列:
com.apple。主線程
#0 0x00459b2c在 - [UIView的(CALayerDelegate)actionForLayer:forKey:]()
#1 0x00eaaac7在 - [CALayer的actionForKey:]()
#2 0x00ea80fe在actionForKey(CALayer的*, CA: :事務*,的NSString *)()
#3 0x00ea8066在beginChange(CALayer的*,CA ::交易*,無符號整型, objc_object * &)()
#4 0x00eaba3a在CALayerSetPosition(CALayer的*, CA: :Vec2 const &,bool)()
#5 0x00eab8b5 in - [CALayer setPosition:]()
#6 0x00 eab7cc在 - [CALayer的SETFRAME:]()
#7 0x0045739d在 - [UIView的(幾何)SETFRAME:]()
#8 0x00542a68在 - [的UILabel SETFRAME:]()
#9 0x0000a97f在 - [MosaicElementView setupWithAdvert:]在 /Users/eino/Prog/AJ/Classes/Search/SubViews/MosaicElementView.m:30
#10 0x00079cb9在 - [SearchResultsViewController setupElement:withCell:indexPath:actualIndex:] ()
#11 0x000797a2 in - [SearchResultsViewController tableView:cellForRowAtIndexPath:]()
#12 0x004957fa in - [UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:withIndexPath:] ()
#13 0x0048b77f在 - [UITableView的(UITableViewInternal)_createPreparedCellForGlobalRow:]()
#14 0x004a0450在 - [UITableView的(_UITableViewPrivate)_updateVisibleCellsNow:]()
#15 0x00498538在 - [UITableView的layoutSubviews]()
# 16 0x00eb0451在 - [CALayer的layoutSublayers]()
#17 0x00eb017c在CALayerLayoutIfNeeded()
#18 0x00ea937c在CA ::語境:: commit_transaction(CA ::交易*) ()
#19 0x00ea90d0在CA: :Transaction :: commit()()
#20 0x00ed97d5在CA :: Transaction :: observer_callbac K(__ CFRunLoopObserver *, 無符號長,無效*)()
#21 0x017e9fbb在__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#在__CFRunLoopDoObservers()
#23 0x01747bd7在__CFRunLoopRun()22 0x0177f0e7
#24 0x01747240在CFRunLoopRunSpecific(在CFRunLoopRunInMode())
#25 0x01747161
#26 0x01e7d268在GSEventRunModal()
#27 0x01e7d32d在GSEventRun()
#28 0x0043042e在UIApplicationMain()
#29 0x000021fe在主在/Users/eino/Prog/AJ/main.m:11

的crasing線從框架9基本上只是在幀改變:

labelPrice.frame = rect; 

與矩形感一個正確的CGRect(106,143,86,22)。

+0

你可以添加崩潰日誌? – 2011-06-17 11:13:24

+0

你可以添加`event`的值嗎?它可能是一個壞鑰匙? – 2011-06-17 12:22:12

回答

9

您可能已經檢查了這一點,但它是值得出手......

你確定你沒有做任何會影響在後臺線程中任何UI元素?也許你正在做一些與這個搜索有關的計算,並且它改變了一些視圖的屬性。

我看過他的諸如此類的事情在我忘了performSelectorOnMainThread情況:withObject:waitUntilDone:打電話,然後改變背景的用戶界面。