使用64位arm64构建时,obj_msgSend函数指针崩溃

时间:2014-02-18 02:58:40

标签: objective-c ios7 crash 64-bit arm64

实际上我的原始代码适用于Xcode 5.0.2,也非常适合发送到App Store:

objc_msgSend(self.target, self.successAction, category);

此行导致Xcode5.1 beta5崩溃。我找到了解决崩溃问题的解决方案: SudzC ARC version - objc_msgSend call causes EXC_BAD_ACCESS using 64-bit architecture

// solution
id (*response)(id, SEL, id) = (id (*)(id, SEL, id)) objc_msgSend;
response(self.target, self.successAction, category);

在使用推荐的解决方案时,使用Xcode 5或Xcode5.1beta在设备(iPhone 5s)或模拟器(32位或64位)上进行测试时完全没问题。 Build Settings中的架构设置是Xcode 5中的“标准架构(armv7,armv7s)”和“标准架构(armv7,armv7s,arm64)”。

然而,我的新版应用程序已于今天在App Store上发售。它会在安装的每台设备(iPhone 5s,5,4s)上崩溃(根据Crashlytics报告)。 由于我没有使用Xcode(构建到真实设备)获得崩溃,我不知道在Apple审核之前是否解决了这个问题。

1 个答案:

答案 0 :(得分:9)

最后,我现在可以重现崩溃。只需编辑Build Scheme并将“Run YOURAPPNAME.app”从Debug更改为Release。

我可以重现这个错误,我知道如何修复它。由于我的选择器函数类型是void(不返回任何内容),我不应该只复制问题所做的(使用“id”)。

通过更改:

id (*response)(id, SEL, id) = (id (*)(id, SEL, id)) objc_msgSend;
response(self.target, self.successAction, category);

要:

void (*response)(id, SEL, id) = (void (*)(id, SEL, id)) objc_msgSend;
response(self.target, self.successAction, category);

它修复!!或者感谢this commit on github的单行代码:

((void(*)(id, SEL, id))objc_msgSend)(self.target, self.successAction, category);