animationForKey上的EXC_BAD_ACCESS:

Dr.*_*eon 0 cocoa exc-bad-access objective-c quartz-graphics cagradientlayer

我正在尝试使用Scintilla组件的最新功能,该组件提供类似OSX的文本突出显示效果(黄色动画弹跳框),并且我遇到了间歇性弹出的错误:

EXC_BAD_ACCESS

指向这个特定的行:

if (layerFindIndicator!=nil)
        if ([layerFindIndicator animationForKey:@"animateFound"])
            [layerFindIndicator removeAnimationForKey:@"animateFound"];
Run Code Online (Sandbox Code Playgroud)

(ifs是我的;以防万一我把对象layerFindIndicator弄为零,或者解除分配或其他什么......不幸的是,它没有帮助......)

layerFindIndicator似乎是一个子类CAGradientLayer.(您可能会看到完整的代码layerFindIndicator,在这里).

既然,我是Quartz Core的绝对新手,请给我任何关于如何进行调试的提示?

Pet*_*sey 5

既然,我是Quartz Core的绝对新手,请给我任何关于如何进行调试的提示?

这与QuartzCore没有任何关系(至少,我希望不是) - 这是一般的 - 对象 - 已经被杀死 - 在它之前的时间 - 如何找到杀手的东西.

在Xcode中:

  1. 编辑您当前的方案.
  2. 对于Profile操作,将其设置为使用Debug构建配置.
  3. 关闭它,然后点击Profile命令.

Xcode将为该操作构建,然后启动Instruments.

仪器会提示您选择模板; 你想要僵尸模板.一旦您选择了它,Instruments将创建一个跟踪文档并运行您的应用程序.切换到您的应用程序(如果它不是最前面的),然后做任何导致崩溃的事情.

如果崩溃真的是一个死对象崩溃,僵尸将揭示它.你会在Instruments的时间线上得到一个标志,上面写着"发送给僵尸对象0xd3c2b1a0的消息",你的程序可能很快就会退出.

在那个标志是一个小小的按钮,看起来像这样:➲除了它将是灰色的.点击它.

这会将您带到该对象的历史记录(实际上是该地址的历史记录,包括任何先前的对象或在该地址开始的其他分配).显示扩展详细信息窗格(显示在堆栈跟踪右侧的那个),然后向下滚动到最后,然后逐步向后移动(向上),查看版本和自动释放,查找不是平衡对象的分配或保留.

解决方案可能涉及以下一项或多项:

  • 将财产改为strongweak不是assign/unsafe_unretained
  • 添加以前没有强烈拥有对象的属性
  • 重新解释一些事情,如果不清楚上面你需要做什么,或者其中任何一个看起来像肮脏的黑客
  • 切换到ARC以获取weak属性和__weak实例变量(两者都nil在引用的对象死亡时自动设置)并将局部变量隐式初始化为nil

但这取决于你在仪器中发现的东西.而且,当然,你的问题很可能 - 糟糕的访问 - 根本不是一个死对象,所有这些都无法帮助你.