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);
        
        }
    
  • 相关阅读:
    Solr多核的配置
    Solr开发参考文档(转)
    Solr使用solr4J操作索引库
    Solr和IK分词器的整合
    Solr与mmseg4J的整合
    Lucene实例教程
    Lucene简介
    PHP实现大文件的上传设置
    图片上传预览功能实现
    Logstash 安装和使用
  • 原文地址:https://www.cnblogs.com/funny11/p/10062836.html
Copyright © 2011-2022 走看看