最近在KVO底层原理中用到了obj_msdSend函数,在模拟器上正常,但是在真机上闪退。
首先感谢 乌鸦白WHITECROW ,在他文章的最后给出了苹果连接,看到苹果的指导瞬间知道该怎么做了。
苹果官方的关于真机闪退的解决方法:
必须先定义原型才可以使用,这样才不会发生崩溃
废话不多说,直接上关键代码
一个是调用父类的setName方法
//改为父类的类型,调用父类的set方法 Class newClass = [self class]; object_setClass(self, class_getSuperclass(newClass)); void (* action1)(id,SEL,NSString *) = (void (*) (id,SEL,NSString *))objc_msgSend; action1(self,@selector(setName:),newName);
另一个是KVO中观察者调用
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
方法。代码如下:
//改为子类 object_setClass(self, newClass); //观察者 id observer = objc_getAssociatedObject(self, "observer"); if (observer) { void (* action)(id,SEL,NSString *,id,NSDictionary *,id) = (void (*) (id,SEL,NSString *,id,NSDictionary *,id)) objc_msgSend; action(observer,@selector(observeValueForKeyPath:ofObject:change:context:),@"name",self,@{@"kind":@"1",@"new":newName},nil); }