崩溃在actionForLayer:forKey: [英] Crash in actionForLayer:forKey:

查看:381
本文介绍了崩溃在actionForLayer:forKey:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在更改某些UILabel的帧时,我有一个神秘的EXC_BAD_ACCESS。崩溃是随机的,通常我必须重复几分钟的条件。

I have a cryptic EXC_BAD_ACCESS when changing some UILabel's frame. The crash is random, usually I have to repeat the conditions for several minutes.

启用NSZombies以及其他内存调试标志(NSDebugEnabled,MallocStackLogging),帮助,崩溃仍然保持不透明:只是一个BAD_ACCESS,控制台中没有消息。目标似乎是正确和活跃的,因此它看起来不像是一个解除分配的内存问题。

Enabling NSZombies, as well as other memory debug flags (NSDebugEnabled, MallocStackLogging), doesn't help, the crash stills stays as opaque : just a BAD_ACCESS with no message in the console. The target seems correct and alive, so it doesn't look like a deallocated memory problem.

为了获得更多信息,我将UILabel子类化并重写了崩溃函数:

To get some more info, I subclassed UILabel and rewrote the crashing function :

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

它在超级方法中崩溃,但在检查时一切似乎都正确(打印retainCount为'self'和'layer'分别给出3和2):

It crashes in the super's method, but on inspection everything seems correct (printing retainCount for 'self' and 'layer' gives respectively 3 and 2) :


(gdb)po self

(gdb) po self

< TestUILabel:0x6ac2800;
baseClass = UILabel; frame =(173 174;
0 0); text ='54m²'; opaque = NO;
autoresize = LM + TM;
autoresizesSubviews = NO;
userInteractionEnabled = NO;
动画= {
position =< CABasicAnimation:
0xe07ba60>; }; layer =< CALayer:
0xbf1b950 >>

< TestUILabel: 0x6ac2800; baseClass = UILabel; frame = (173 174; 0 0); text = '54 m²'; opaque = NO; autoresize = LM+TM; autoresizesSubviews = NO; userInteractionEnabled = NO; animations = { position=< CABasicAnimation: 0xe07ba60>; }; layer = < CALayer: 0xbf1b950>>

(gdb)po event

(gdb) po event

bounds

(gdb)po layer

(gdb) po layer

< CALayer的:0xbf1b950;
position = CGPoint(173 174); bounds =
CGRect(0 0; 0 0); delegate =
< TestUILabel:0x6ac2800; baseClass =
UILabel; frame =(173 174; 0 0);文字
='54m²'; opaque = NO; autoresize = LM + TM; autoresizesSubviews = NO;
userInteractionEnabled = NO;
动画= {
position =< CABasicAnimation:
0xe07ba60>; }; layer =< CALayer:
0xbf1b950 >>; contents =< CGImage
0xe04ed60>; opacity = 1;动画=
[position =< CABasicAnimation:
0xe07ba60>]>

< CALayer:0xbf1b950; position = CGPoint (173 174); bounds = CGRect (0 0; 0 0); delegate = < TestUILabel: 0x6ac2800; baseClass = UILabel; frame = (173 174; 0 0); text = '54 m²'; opaque = NO; autoresize = LM+TM; autoresizesSubviews = NO; userInteractionEnabled = NO; animations = { position=< CABasicAnimation: 0xe07ba60>; }; layer = < CALayer: 0xbf1b950>>; contents = < CGImage 0xe04ed60>; opacity = 1; animations = [position=< CABasicAnimation: 0xe07ba60>]>

是否有人遇到类似的问题?或者有什么想法可以来自哪里?

Did someone get a similar problem ? Or have any ideas where this could come from ?

提前致谢!

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

here's the complete crash backtrace :


线程1,队列:

com.apple.main-thread

#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 *&)()

#4 0x00eaba3a在CALayerSetPosition(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 / ei no / 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]()

#17 0x00eb017c in CALayerLayoutIfNeeded()

#18 0x00ea937c in CA :: Context :: commit_transaction(CA :: Transaction *)
()

#19 0x00ea90d0 in CA :: Transaction :: commit()()

# 20 0x00ed97d5 in CA :: Transaction :: observer_callback(__ CFRunLoopObserver *,
unsigned long,void *)()

#21 0x017e9fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
()

#22 0x0177f0e7 in __CFRunLoopDoObservers()

#23 0x01747bd7 in __CFRunLoopRun()

#24 0x01747240 in CFRunLoopRunSpecific()

#25 0x01747161 in CFRunLoopRunInMode()

#26 0x01e7d268 in GSEventRunModal ()

#27 0x01e7d32d in GSEventRun()

#28 0x0043042e in UIApplicationMain()

#29 0x000021fe in main at / Users / eino / Prog / AJ / main.m:11

Thread 1, Queue :
com.apple.main-thread
#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*&) ()
#4 0x00eaba3a in CALayerSetPosition(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] ()
#17 0x00eb017c in CALayerLayoutIfNeeded ()
#18 0x00ea937c in CA::Context::commit_transaction(CA::Transaction*) ()
#19 0x00ea90d0 in CA::Transaction::commit() ()
#20 0x00ed97d5 in CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) ()
#21 0x017e9fbb in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#22 0x0177f0e7 in __CFRunLoopDoObservers ()
#23 0x01747bd7 in __CFRunLoopRun ()
#24 0x01747240 in CFRunLoopRunSpecific ()
#25 0x01747161 in CFRunLoopRunInMode ()
#26 0x01e7d268 in GSEventRunModal ()
#27 0x01e7d32d in GSEventRun ()
#28 0x0043042e in UIApplicationMain ()
#29 0x000021fe in main at /Users/eino/Prog/AJ/main.m:11

第9帧的删除线基本上只是帧的变化:

The crasing line from frame 9 is basically just the frame change :

labelPrice.frame = rect;

,其中rect是正确的CGRect(106,143,86,22)。

with rect being a correct CGRect (106, 143, 86, 22).

推荐答案

你可能已经检查了这个,但值得拍摄......

You probably already checked for this, but it's worth shot...

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

Are you certain that you aren't doing anything that would effect any UI elements in a background thread? Perhaps you're doing some computation related to this search and it changes a property of some view.

在我忘记了performSelectorOnMainThread的情况下,我看到了他的那种情况: withObject:waitUntilDone:调用然后在后台更改UI。

I have seen his sort of thing in cases where I forgot a performSelectorOnMainThread:withObject:waitUntilDone: call and then altered the UI in the background.

这篇关于崩溃在actionForLayer:forKey:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆