在 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 应用程序中输入文本