最近在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);
}