BlocksKit 理解(二) runtime常用Api理解

以及Runtime一些Api的理解

  • objc_getProtocol 函数,返回指定的协议 Protocol* objc_getProtocol(const char* name);

    • 需要注意的是如果 仅仅声明了一个协议,而未在任何类中实现这个协议的话。则会返回nil
  • class_getProperty(self, name) 返回一个objc_property_t。这个objc _ property _ t本质是一个结构体指针 如果没有相关的属性则会找不到。

typedef struct objc_property *objc_property_t;

  • 通过拿到的objc_property_t属性然后property_getName(<#objc_property_t property#>) 获取属性名字。通过Person中有一个NSString的属性name, @property (copy,nonatomic) NSString*name; 如果通过property_getName得到的是"name",通过property_getAttributes获得是T@"NSString",C,N,V_name 。
  • sel_registerName(const char*) 获取的是一个SEL对象。比如通过setMailDelegate可以获取一个SEL对象 。注册是说原来不存在这个SEL的话,注册得到新的SEL。
  • sel_getUid(const char*)返回一个SEL。通过已有propery拿到这个const char * 然后通过sel_getUid获取这个SEL
  • property_getAttributes(property) 可以获取一个const char*对象上文提到了。获取的是T@?,C,D,N,Sbk_setCompletionBlock:类似这样的一种结构。
  • Method相关。class_getClassMethod(Class cls,SEL sel),获得是一个类的Method实例。 class_getInstanceMethod(Class cls,SEL sel)获取的是一个实例包含的是实例方法的一个Method。跟其他的同理与之对应的是class_copyMethodList。获取的是一个Method的数组。

  • class_addMethod(Class cls,SEL sel,IMP imp,types:const char*) 类增加实例方法。返回一个BOOL判断是否增加过这个方法

总结一下runtime api的特点

  • class_get 类型得到一个特定的结构体指针

  • class_getName(Class cls) 得到一个类名字 const char*

  • class_getSuperClass(cls) 得到父类返回的是Class

  • class_getProperty(Class cls, const char*)得到一个属性 objc_property_t 类型

  • class_getClassMethod,class_getInstanceMethod得到类方法Method或者得到实例方法Method

  • class_getMethodImplement(Class cls, const char*)得到一个IMP指针

  • class_getInstanceVariable 的到一个实例方法的Ivar ,class_getClassVariable得到类方法的Ivar

  • class_copy系列 ,得到一个上面结构体的数组

    • class_copyIvarList 得到一个Ivar列表。通过Ivar能够获取这个成员的name,attributes等属性 ivar_getName(ivar),ivar_getEncodingType(ivar)
    • class_copyMethodList的到方法列表。得到的是一个Method数组。然后可以得到各种method相关的Api。 method_getName(method),method_getInstanceImplment返回的是一个IMP指针。method_getTypeEncoding返回的是一个const char*。
  • class_copyPropertyList 获取属性列表。获取的是一个objc_property_t 的数组。

  • class_copyProtocolList 获取的是一个Protocol数组

  • class_add系列

    • class_addMethod 动态增加方法
    • class_addIvar 增加成员
    • class_addProperty 增加属性
    • class_addProtocol 增加协议
  • object_类型

    • object_getClass返回一个Class对象
    • object_getClassName获取对象名称
    • object_isClass(id obj) 返回一个Bool值
  • objc_系列

    • objc_getProtocol 获取的是一个Protocol指针

你可能感兴趣的:(BlocksKit 理解(二) runtime常用Api理解)