实际上我的原始代码适用于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审核之前是否解决了这个问题。
答案 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);