美文网首页
iOS RunTime 理解

iOS RunTime 理解

作者: iChuck | 来源:发表于2017-10-25 21:47 被阅读9次
  1. 可以遍历对象的属性
  2. 可以动态的添加、修改属性,动态添加、修改、替换方法,动态添加、修改、替换协议
  3. 可以动态创建类、对象、协议
  4. 可以拦截方法

/**
利用runtime 可以实现一些OC 不容易实现的功能

  1. 动态交换两个的实现(特别是交换系统自带的方法)
  2. 动态添加成员变量和成员方法
  3. 获得某个类的所有方法,所有变量
    */

OC: [obj func];
runtime: objc_msgSend(obj, @selector(func));

// 获取属性
id personClass = objc_getClass("CZPerson");
unsigned int outCount;
objc_property_t *propertys = class_copyPropertyList(personClass, &outCount);
for (int i = 0; i < outCount; i++) {
objc_property_t property = propertys[i];
printf("%s:%s\n", property_getName(property), property_getAttributes(property));
}

free(propertys);

/// 使用: 可以在分类中实现方法,替换原生方法,实现自己的想要的东西
// 获取某个类的方法
// class_getClassMethod(__unsafe_unretained Class cls, SEL name)

// 获取某个实例对象方法

// class_getInstanceMethod(__unsafe_unretained Class cls, SEL name)

// 交换两个方法

// method_exchangeImplementations(Method m1, Method m2)

/// 使用: 在分类中使用getter setter 方法
// setter 将某个值跟某个对象关联起来,将某个值存到对象中去

// objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
// getter
// objc_getAssociatedObject(self, nameKey);

/// 使用: 获取类中的所有方法和变量

// class_copyIvarList(__unsafe_unretained Class cls, unsigned int *outCount)
// 获取成员变量的名字
// ivar_getName(Ivar v);
// 获取成员变量的类型
// ivar_getTypeEncoding(Ivar v)

相关文章

网友评论

      本文标题:iOS RunTime 理解

      本文链接:https://www.haomeiwen.com/subject/dphsmttx.html