EXC_BAD_ACCESS on animationForKey:
我正在尝试使用Scintilla组件的最新功能,该组件提供类似OSX的文本高亮效果(黄色动画弹跳框),并且卡住了弹出的错误向上间歇:EXC_BAD_ACCESS on animationForKey:
EXC_BAD_ACCESS
指向该特定行:
if (layerFindIndicator!=nil)
if ([layerFindIndicator animationForKey:@"animateFound"])
[layerFindIndicator removeAnimationForKey:@"animateFound"];
(if
是我的;以防万一我发现对象layerFindIndicator
为零,或解除分配或其他...不幸的是,它并没有帮助......)
layerFindIndicator
看似是CAGradientLayer
的一个子类。 (您可能会看到layerFindIndicator
,here的完整代码)。
因为我是一个绝对的新手石英芯,请给我任何提示,以便如何调试?
因为,我是一个绝对的新手到石英核心,能告诉我任何暗示为这到底是怎么调试?
这与QuartzCore没有任何关系(至少我希望不是) - 它的一般this-object-has-been-killed-before-its-time-how-do-I-找到杀手的东西。
在Xcode中:
- 编辑你当前方案。
- 对于配置文件操作,将其设置为使用调试配置。
- 关闭并点击Profile命令。
Xcode将为该操作构建并启动仪器。
仪器会提示您选择一个模板;你想要僵尸模板。一旦您选择了它,Instruments将创建一个跟踪文档并运行您的应用程序。切换到你的应用程序(如果它不是最前面的),然后做任何事情导致崩溃。
如果崩溃确实是死对象崩溃,僵尸会显示它。你会在乐器的时间线上得到一个标志,例如“发送给僵尸对象0xd3c2b1a0的消息”,并且你的程序可能很快就会退出。
在那个标志是一个小小的按钮,看起来像这样:➲除非它是灰色的。点击它。
这将带您到该对象的历史(实际上是该地址,包括任何以前的对象或在该地址开始的其他分配)。显示扩展详细信息窗格(右侧显示堆栈轨迹的窗口),然后向下滚动到结尾,然后逐步向后(向上)移动,查看发布和自动发布,查找不是不平衡对象的分配或保留。
该解决方案将可能涉及的一个或多个:
- 更改属性为
strong
或weak
而不是assign
/unsafe_unretained
- 添加属性,你以前不强拥有对象
- 重新构建一些东西,如果不清楚上面哪一个你需要做或者其中一个看起来像是肮脏的破解
- 切换到ARC得到
weak
性能和__weak
实例变量(这两者时自动被引用的对象死亡被置到nil
),并获得局部变量被隐式初始化nil
但它会取决于你在仪器查找。而且,当然,您的问题(糟糕的访问)有可能不是死对象,上述所有内容都无法帮助您。
试试这个:
if (layerFindIndicator!=nil){
if ([layerFindIndicator animationForKey:@"animateFound"]){
[layerFindIndicator removeAnimationForKey:@"animateFound"];
}
}
还要检查,看是否被释放它不然,。
编辑:
另一件事我发现你没有一个空白的如果。现在您的代码应该是这样的:
if (layerFindIndicator != nil){
if ([layerFindIndicator animationForKey:@"animateFound"]){
[layerFindIndicator removeAnimationForKey:@"animateFound"];
}
}
虽然我个人会用括号重写OP原始代码有 - 这对功能没有任何区别... – 2012-04-22 15:38:03
哦,失败了。我虽然是**必须** ...我想我应该重新阅读我的Objective C书。 – Sirens 2012-04-22 15:40:51
我自己通常不会这样写(没有括号);我只是为了调试而输入(当我调试时我个人不在乎造型......):-) – 2012-04-22 15:42:00
我会猜测layerFindIndicator'已经'dealloc''ed了。如果声明不会防止尚未设置为零的释放对象。例如寻找你释放它的地方...... – 2012-04-22 15:22:25
@ Paul.s你在这里已经有了相当多的观点,但是我绝对不能发现这个对象在哪里被处理过......(这不是我的代码,而是我的代码片段一些新的增加,使其成为最新的Scintilla版本,所以我很迷茫)。我现在试图在创建对象之前(因为它应该创建),它似乎正在工作(到目前为止,那是...) – 2012-04-22 15:45:57