【问题标题】:Crash in actionForLayer:forKey:actionForLayer:forKey 中的崩溃:
【发布时间】:2011-09-17 01:47:53
【问题描述】:

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

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

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

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

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

(gdb) po 自我

; };层 = >

(gdb) po 事件

界限

(gdb) po 层

<0xbf1b950 cgpoint cgrect uil lm cabasicanimation>






&
&
























标签: iphone ios uiview calayer exc-bad-access


【解决方案1】:

此崩溃具有似乎使用 UIKit 类或函数的非主线程。一般来说,只有在主线程中使用 UIKit 才是安全的。从后台线程调用 UIKit 可能会导致不可预知的行为(如崩溃!)。请仔细检查您的所有代码(不在主线程上)是否已被 Apple 明确标记为可在后台安全使用。

外部资源:

UIKit Framework Reference

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这是个好主意,也是一种合理的可能性。我现在不能肯定地说(项目已经完成),但在其他线程中确实有相当多的计算,以及与计算相关的回调操作。因此,标签有时会以导致 actionForLayer:forKey 函数崩溃的方式进行修改并非不可能。然而,我没有多少时间,最终通过阻止调用这个失败的函数 (actionForLayer:forKey:) 来解决问题。
    • 我也遇到了这种神秘的崩溃...请务必查看调试导航器,因为它显示了崩溃发生的确切线程。至少在我的情况下是这样。
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2022-11-02
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    相关资源
    最近更新 更多