5

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

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

此行会导致 Xcode5.1 beta5 崩溃。我找到了修复崩溃的解决方案: SudzC ARC 版本 - objc_msgSend 调用导致 EXC_BAD_ACCESS 使用 64 位架构

// 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 中的“Standard architectures (armv7, armv7s)”和“Standard architectures (armv7, armv7s, arm64)”。

不过,我的新版应用程序今天已准备好在 App Store 上销售。它在安装的每台设备(iPhone 5s、5、4s)上崩溃(根据 Crashlytics 报告)。由于我没有使用 Xcode(构建到真实设备)导致崩溃,因此在 Apple 审查之前我不知道我是否解决了问题。

4

1 回答 1

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);

它修复了!或者感谢github 上的这个提交,或者一行代码:

((void(*)(id, SEL, id))objc_msgSend)(self.target, self.successAction, category);
于 2014-02-18T14:08:53.053 回答