使用objc_msgSend真机调试崩溃解决方法

问题描述
  • 最近一个项目中使用Class动态创建自定义cell用到了objc_msgSend方法,在模拟器上面跑一点问题也没有,但是放到iphone 6上面发现运行到这个方法直接崩溃了 报EXC_BAD_ACCESS错误,当天下午搞了一下午也没解决,今天上午终于发现是因为arm处理器架构的原因

  • 先普及下iphone的arm常识
    armv6、armv7、armv7s、arm64都是arm处理器的指令集,所有指令集原则上都是向下兼容的,如iPhone4S的CPU默认指令集为armv7指令集,但它同时也兼容armv6指令集,只是使用armv6指令集时无法充分发挥其性能,即无法使用armv7指令集中的新特性,同理,iPhone5的处理器标配armv7s指令集,同时也支持armv7指令集,只是无法进行相关的性能优化,从而导致程序的执行效率没那么高。

需要注意的是iOS模拟器没有运行arm指令集,编译运行的是x86指令集,所以,只有在iOS设备上,才会执行设备对应的arm指令集。这也是为什么我们在模拟器上面没出现这个原因

目前为止apple移动设备默认的指令集
  • arm6 设备:iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
  • armv7 设备:iPhone3GS, iPhone4, iPhone4S, iPad, iPad2, iPad3(The New iPad), iPad mini , iPod Touch 3G, iPod Touch4
  • armv7s设备: iPhone5, iPhone5C, iPad4(iPad with Retina Display)
  • arm64 设备: iPhone5S, iPad Air, iPad mini2(iPad mini with Retina Display)

关于更多Apple移动设备处理器指令集的介绍可以参考这里

Apple官方提出的解决方案()内容如下
  • 必须先定义原型才可以使用,这样才不会发生崩溃
- (int) doSomething:(int) x { ... }
- (void) doSomethingElse {
   int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;
   action(self, @selector(doSomething:), 0);
}

苹果关于64位崩溃详细说明见此处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值