【发布时间】:2015-07-24 23:25:39
【问题描述】:
我正在尝试调试 iOS 上的崩溃,该崩溃在支持 A64 instruction set 的设备上始终如一地重现。特别是使用A7/A8X SoC 的 iPad。在任何 32 位 iPad 上运行时,完全相同的代码也将始终不会崩溃(如果我将构建限制为仅 32 位架构,然后在支持 64 位的 iPad)。
崩溃报告为EXC_BAD_ACCESS,触发它的代码没有什么特别花哨的:
if (object && [self respondsToSelector:addSelector]) {
objc_msgSend(self, addSelector, object); //EXC_BAD_ACCESS on A64 devices!
//[self performSelector:addSelector withObject:object]; //no crash
}
违规行是objc_msgSend(self, addSelector, object);。第一个令人困惑的部分是,如果我用[self performSelector:addSelector withObject:object]; 替换这一行,一切都会正常运行(尽管它给我留下了令人讨厌的“PerformSelector 可能导致泄漏......”警告)。除非我完全误解了某些东西,否则objc_msgSend 和performSelector:withObject: 在这种情况下应该基本上是等价的。
那么为什么一个会崩溃(并且仅在使用 A64 时)而另一个不会?
下一个令人费解的事情是在崩溃发生时尝试调试它。 self 和 object 都是 NSManagedObject 实例,我可以在调试器中观察到它们都是有效对象。但是,异常总是报告为:
-[NSManagedObjectContext entity]: unrecognized selector sent to instance 0x...
调用显示为源自CoreData 的内部结构,我无法给出任何合理的解释来说明这是如何发生的,尤其是从 32 位切换到64 位架构/构建。
对于导致此类问题的原因有什么想法吗?还是我应该直接使用 performSelector:withObject: 并开心?
【问题讨论】:
-
你使用的是 SQLite 数据库类型吗?
-
@WarrenBurton - 是的,该应用使用
NSSQLiteStoreType和 CoreData。 -
什么是
addSelector? -
如果可能,您可以更改为
NSBinaryStoreType并查看崩溃是否重现。并不是说这是一个长期的解决方案。只是想看看 SQLite 引擎是否存在故障。 -
@Cy-4AH - 它有些可变,但是
addSelector将始终是用于操作“对多”关系的“CoreDataGeneratedAccessor”方法,适用于entity和object被操纵。
标签: ios objective-c ipad 32bit-64bit