OC-Runtime温故知新

每个java应用程序都有一个runtime类实例,使应用程序能够与其运行的环境相连接。可以通过getRuntime 方法获取当前运行时,应用程序不能自己创建runtime类实例。Runtime 没有构造方法,说明不能创建对象。当这个类没有构造方法而且有非静态的方法,说明,这个类至少有一个静态方法,而且返回的是该类的对象。runtime就提供了一个静态的获取对象的方法,并且这个方法采用了单例模型的设计模式,保证了唯一性。

面试问答:
问:你用过单例吗?在哪里见过或者用过单例?
答:runtime就是一个单例的例子。

Runtime的最大优势:能拿到与内存数的数据。有的应用可以拿到虚拟机的内存。

 

  • Runtime的简介
runtime就是运行时。OC是运行时机制,其中最主要的是消息机制。
对于C语言而言,在编译的时候,就会决定调用了哪个函数。也就是说,在编译的时候,C语言调用未实现的函数会报错。
对于OC来说,是属于动态调用过程,在编译的时候并不能决定调用哪个函数。只有真正运行的时候才根据函数名去获取该方法的函数。也就说,在编译的时候,OC可以调用任何方法,即使这个函数并未实现,只要声明了就可以。

 

  • Runtime的交换方法
  • //这个方法只调用一次,就是分类加载的时候
    + (void)load {
       // 交换方法的实现  
    }

     

 

  • Runtime获取对象的属性
  • Iva 成员变量
    Method 方法
    Property 属性
    Protocol 协议

    思路:
    1.创建NSObject的分类,添加一个获取对象属性的方法:

      + (NSArray *)getPropertyList;
    2.用class_copyPropertyList这个方法获取类的所有属性,但是这个是C语言的,需要转化一下
    
    

     

  •  用runtime添加属性值
  • 假设创建了一个person类,需要在分类上添加一个属性height,步骤如下:
    1.添加一个person的分类
    
    在分类的.h 上 添加一个属性
    @interface Person (category)
    
    @property (nonatomic, copy) NSString *height;
    
    @end
    
    在分类的.m 上 添加如下的代码
    
    (需要导入头文件:#import <objc/message.h>- (void)setHeight:(NSString *)height {
        
        //保存属性到系统的类
        //产生关联,让某个对象(height)与当前对象的属性的height产生关联
        //object:给哪个对象添加属性
        //key:属性名
        //value:属性值
        //policy:策略
        objc_setAssociatedObject(self, @"height", height, OBJC_ASSOCIATION_COPY_NONATOMIC);
    }
    
    - (NSString *)height {
        return objc_getAssociatedObject(self, @"height");
    }

     

posted @ 2018-10-01 21:14  一人前行  阅读(131)  评论(0编辑  收藏  举报