zoukankan      html  css  js  c++  java
  • 解决真机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);
        
        }
    
  • 相关阅读:
    时间计算
    DateTime
    C# trim split dataGrid
    something
    生活
    如何导入外部的源码到eclipse中
    java类中获取ServletContext的方法
    获取spring容器上下文(webApplicationContext)的几种方法
    java反射(转)
    mysql常见命令
  • 原文地址:https://www.cnblogs.com/funny11/p/10062836.html
Copyright © 2011-2022 走看看