0

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

EXC_BAD_ACCESS

指向这个特定的行:

if (layerFindIndicator!=nil)
        if ([layerFindIndicator animationForKey:@"animateFound"])
            [layerFindIndicator removeAnimationForKey:@"animateFound"];

ifs 是我的;以防万一我发现对象layerFindIndicator为零,或被释放或其他什么......不幸的是,它无济于事......)

layerFindIndicator似乎是 的子类CAGradientLayer(您可能会在此处看到完整的代码layerFindIndicator)。

因为,我是Quartz Core的绝对新手,请给我任何关于如何调试的提示?

4

2 回答 2

5

因为,我是 Quartz Core 的绝对新手,请给我任何关于如何调试它的提示?

这与 QuartzCore 没有任何关系(至少,我希望不是)——这是一般的 this-object-has-been-killed-before-its-time-how-do-I-find-the-killer 的东西.

在 Xcode 中:

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

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

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

如果坠机真的是死物坠机,僵尸会揭露它。你会在 Instruments 的时间线上得到一个标志,上面写着“发送到僵尸对象 0xd3c2b1a0 的消息”,然后你的程序可能很快就会退出。

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

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

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

  • 将属性更改为strongweak而不是assign/unsafe_unretained
  • 在您之前没有强烈拥有对象的位置添加属性
  • 重新架构一些东西,如果不清楚你需要做上述哪一项,或者其中任何一项看起来像一个肮脏的黑客
  • 切换到 ARC 以获取weak属性和__weak实例变量(当被引用的对象死亡时,这两者都会nil自动设置为)并让局部变量被隐式初始化为nil

但这取决于您在 Instruments 中找到的内容。而且,当然,您的问题(错误的访问权限)有可能根本不是一个死对象,以上所有内容都对您没有帮助。

于 2012-04-22T18:31:31.600 回答
-1

试试这个:

if (layerFindIndicator!=nil){
    if ([layerFindIndicator animationForKey:@"animateFound"]){
        [layerFindIndicator removeAnimationForKey:@"animateFound"];
    }
}

还要检查它是否被释放。

编辑:

我发现的另一件事是你在 if 中没有空格。您的代码现在应该如下所示:

if (layerFindIndicator != nil){
    if ([layerFindIndicator animationForKey:@"animateFound"]){
        [layerFindIndicator removeAnimationForKey:@"animateFound"];
    }  
}
于 2012-04-22T15:33:25.280 回答