actionForLayer中的崩溃:forKey:

当改变一些UILabel的框架时,我有一个神秘的EXC_BAD_ACCESS。 碰撞是随机的,通常我必须重复几分钟的条件。

启用NSZombies,以及其他内存debugging标志(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; 帧=(173 174; 0 0); 文字= '54平方米'; opaque = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = NO; animation= {position = <CABasicAnimation:0xe07ba60>; }; 层= <CALayer:0xbf1b950 >>

(gdb)po事件

界限

(gdb)po层

<CALayer:0xbf1b950; position = CGPoint(173 174); 边界= CGRect(0 0; 0 0); delegate = <TestUILabel:0x6ac2800; baseClass = UILabel; 帧=(173 174; 0 0); 文字= '54平方米'; opaque = NO; autoresize = LM + TM; autoresizesSubviews = NO; userInteractionEnabled = NO; animation= {position = <CABasicAnimation:0xe07ba60>; }; 层= <CALayer:0xbf1b950 >>; 内容= <CGImage 0xe04ed60>; 不透明度= 1; animation= [position = <CABasicAnimation:0xe07ba60>]>

有人得到类似的问题? 或有任何想法,这可能来自?

提前致谢 !

编辑:这是完整的崩溃回溯:

线程1,队列:
com.apple.main线程
#0 0x00459b2c in – [UIView(CALayerDelegate)actionForLayer:forKey:]()
#1 0x00eaaac7 in – [CALayer actionForKey:]()
#2 0x00ea80fe in actionForKey(CALayer *,CA :: Transaction *,NSString *)()
#3 0x00ea8066 in beginChange(CALayer *,CA :: Transaction *,unsigned int,objc_object *&)()
#CALayerSetPosition中的0x00eaba3a(CALayer *,CA :: Vec2 const&,bool)()
#5 0x00eab8b5 in – [CALayer setPosition:]()
#6 0x00eab7cc in – [CALayer setFrame:]()
#7 0x0045739d in – [UIView(Geometry)setFrame:]()
#8 0x00542a68 in – [UILabel setFrame:]()
#9 0x0000a97f in – [MosaicElementView setupWithAdvert:] at /Users/eino/Prog/AJ/Classes/Search/SubViews/MosaicElementView.m:30
#10 0x00079cb9 in – [SearchResultsViewController setupElement:withCell:indexPath:actualIndex:]()
#11 0x000797a2 in – [SearchResultsViewController tableView:cellForRowAtIndexPath:]()
#12 0x004957fa in – [UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:withIndexPath:]()
#13 0x0048b77f in – [UITableView(UITableViewInternal)_createPreparedCellForGlobalRow:]()
#14 0x004a0450 in – [UITableView(_UITableViewPrivate)_updateVisibleCellsNow:]()
#15 0x00498538 in – [UITableView layoutSubviews]()
#16 0x00eb0451 in – [CALayer layoutSublayers]()
CALayerLayoutIfNeeded()中的#17 0x00eb017c
#18 0x00ea937c在CA :: Context :: commit_transaction(CA :: Transaction *)()
#19 0x00ea90d0 CA :: Transaction :: commit()()
#20 0x00ed97d5 CA :: Transaction :: observer_callback(__ CFRunLoopObserver *,unsigned long,void *)()
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__()中的#21 0x017e9fbb
__CFRunLoopDoObservers()中的#22 0x0177f0e7
__CFRunLoopRun()中的#23 0x01747bd7
CFRunLoopRunSpecific()中的#24 0x01747240
#25 0x01747161 in CFRunLoopRunInMode()
GSEventRunModal()中的#26 0x01e7d268
GSEventRun()中的#27 0x01e7d32d
UIApplicationMain()中的#28 0x0043042e
#29 0x000021fe主要位于/Users/eino/Prog/AJ/main.m:11

从第9帧开始的删除线基本上就是帧的变化:

 labelPrice.frame = rect; 

正确的CGRect(106,143,86,22)。

你可能已经检查过了,但值得一试

你确定你没有做任何会影响后台线程中的任何UI元素? 也许你正在做一些与这个search有关的计算,它改变了一些视图的属性。

在我忘记了performSelectorOnMainThread:withObject:waitUntilDone:call,然后在后台修改UI的情况下,我已经看到了他的一些事情。