问题描述
最近一个项目中使用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官方提出的解决方案()内容如下
- 必须先定义原型才可以使用,这样才不会发生崩溃
- (int) doSomething:(int) x { ... }
- (void) doSomethingElse {
int (*action)(id, SEL, int) = (int (*)(id, SEL, int)) objc_msgSend;
action(self, @selector(doSomething:), 0);
}