以及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)
得到父类返回的是Classclass_getProperty(Class cls, const char*)
得到一个属性 objc_property_t 类型class_getClassMethod,class_getInstanceMethod
得到类方法Method或者得到实例方法Methodclass_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指针