在 Instruments 中运行的 iPhone 应用程序因无法识别的选择器而失败

Posted

技术标签:

【中文标题】在 Instruments 中运行的 iPhone 应用程序因无法识别的选择器而失败【英文标题】:iPhone app running in Instruments fails with unrecognized selector 【发布时间】:2009-08-13 17:27:59 【问题描述】:

我有一个应用程序在正常使用中运行似乎没有问题。 Clang 静态分析器也没有报告任何问题。当我尝试在 Instruments 中运行它时,它会因无法识别的选择器异常而失败。

违规行是一个简单的属性设置器:

self.bar = baz;

为了弄清楚发生了什么,我在其上方添加了一个 NSLog() 调用:

NSLog(@"class = %@ responds = %d", [self class], [self respondsToSelector:@selector(setBar:)]);
self.bar = baz;

在模拟器(没有仪器)和设备上,这正是我所期望的:

class= Foo 响应 = 1

在 Instruments 下运行时,我得到:

class= Foo 响应 = 0

我不知道是什么原因造成的。当它在 Instruments 环境中时,可能会占用不同的内存位置?谁能建议我如何调试它?

【问题讨论】:

【参考方案1】:

如果bar属于自己,你不能bar=baz;吗?

【讨论】:

这不会通知该属性的任何观察者,并且可能 bar 甚至没有直接实现为实例变量。它可以从其他值合成。例如,“fullname”属性可以存储在“firstname”和“lastname”ivar 中,并且没有任何 ivar 直接备份它。【参考方案2】:

检查您的属性。 也许对你来说需要一个 baz 的演员表?

【讨论】:

【参考方案3】:

这里没有足够的信息来了解发生了什么,但是,如果您知道要提供什么信息,您可能已经修复了它。所以。需要检查的几件事:

“self”指针是否以任何方式混合?出于理智考虑,请尝试在各个点打印出 self 的值 当您的代码在 Instruments 中运行时,它是否以不同的模式运行? (32 位与 64 位,垃圾收集与保留释放等)我不确定为什么其中任何一个会产生影响,但如果它以不同的模式运行,那就值得研究了。 您是否正确合成了setter?或者它是动态提供的(通过核心数据等)?如果手动指定setBar: 方法,还会报错吗?

【讨论】:

以上是关于在 Instruments 中运行的 iPhone 应用程序因无法识别的选择器而失败的主要内容,如果未能解决你的问题,请参考以下文章

在 CocoaTouch (iPhone OS) 中,如何查找/消除 Instruments Leak 工具找不到的泄漏?

新使用 XCode Instruments 解释 iPhone 开发的内存警告,需要指导

通过 Instruments 中的脚本编辑器在 iPhone 应用程序中输入文本

从 Instruments 运行时程序不工作

iPhone:使用 Instruments 检测当前内存使用情况?

iPhone 内存泄漏工具