【问题标题】:obj_msgSend function pointer crash when build with 64bit arm64使用 64 位 arm64 构建时 objc_msgSend 函数指针崩溃
【发布时间】:2014-02-18 02:58:40
【问题描述】:

实际上,我的原始代码在 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 中的“Standard architectures (armv7, armv7s)”和“Standard architectures (armv7, armv7s, arm64)”。

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

【问题讨论】:

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


    【解决方案1】:

    最后,我现在可以重现崩溃了。只需编辑 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);
    

    【讨论】:

    • 天啊,你是个巫师!不知道你是怎么想出来的,但它确实有效!非常感谢你)
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2016-06-20
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多