解决真机objc_msgSend闪退的bug

最近在KVO底层原理中用到了obj_msdSend函数,在模拟器上正常,但是在真机上闪退。

首先感谢  乌鸦白WHITECROW ,在他文章的最后给出了苹果连接,看到苹果的指导瞬间知道该怎么做了。

苹果官方的关于真机闪退的解决方法:

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

必须先定义原型才可以使用,这样才不会发生崩溃

废话不多说,直接上关键代码

一个是调用父类的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);
    
    }
原文地址:https://www.cnblogs.com/funny11/p/10062836.html