OC 运行时 记录

typedef struct objc_method *Method; // Method 的定义
 
typedef struct objc_ivar *Ivar; // Ivar 的定义  参数
 
typedef struct objc_category *Category // 这个类有哪些category
 
typedef struct objc_property *objc_property_t; // 属性的定义

struct objc_class {
    Class isa 
    Class super_class 
   long version
   long info 
   long instance_size 
  struct objc_ivar_list *ivars    // 实例参数链表 
   struct objc_method_list **methodLists  // 方法的列表
    struct objc_protocol_list *protocols // 协议的列表
}
 // 定义方法的描述
struct objc_method_description {
  SEL name ; // 方法的名称
 char *types; // 方法的参数
}
// 属性结构的定义
typedef struct {
     const char *name ; // 属性的名称
     const char *value ; // 属性的值 
}objc_property_attribute_t;

Class object_getClass(id obj) // 返回对象的Class 
Class object_setClass(id obj,Class cls) // 修改obj 的Class 
Bool object_isClass(id obj) ;
const char *object_getClassName(id obj); // 返回obj 的Class 名称;
id object_getIvar(id obj,Ivar ivar);//读取对象参数的值  速度比object_getInstanceVariable快
void object_setIvar(id obj ,Ivar ivar ,id value )// 设置对象参数的值  速度比object_setInstanceVariable 快 
但是object_setInstanceVariable 不能再ARC 下使用

/**  获得Class的定义    **/
Class objc_getClass(const char* name ) ; 
Class objc_getMetaClass(const char* name ) ;  // 得到元类
Class objc_lookUpClass(const char *name) // 
class_setVersion(Class cls, int version)
int class_getVersion(Class cls) 
size_t class_getInstanceSize(Class cls) 初始化时需要 的内存大小 
Ivar class_getInstanceVariable(Class cls, const char *name)//获取类中指定名称实例成员变量的信息
Ivar class_getClassVariable(Class cls ,const char *name) / 获取类成员变量的信息 目前 oc 不支持类成员变量 
Ivar *class_copyIvarList(Class cls, unsigned int *outCount)  // 获取所有的实例变量信息
Method class_getInstanceMethod(Class cls, SEL name) //获取实例方法    包含搜索 父类  
 Method class_getClassMethod(Class cls,SEL name) // 获取类的方法  包含搜索 父类  ,如果父类没有此方法,会返回nil
IMP class_getMethodImplementation(Class cls, SEL name) // 返回方法的指针
IMP class_getMethodImplementation_stret(Class cls, SEL name)  // 返回方法的指针 
BOOL class_respondsToSelector(Class cls, SEL sel)  //  类实例是否有 某个方法 
Method *class_copyMethodList(Class cls, unsigned int *outCount)  // 获取类的所有方法 ,不包含父类方法
BOOL class_conformsToProtocol(Class cls, Protocol *protocol) 
 
 Protocol * __unsafe_unretained *class_copyProtocolList(Class cls, unsigned int *outCount) // 获取所有的 协议  free()  不包含 父类 
objc_property_t class_getProperty(Class cls, const char *name) // 得到类的某个属性 
objc_property_t *class_copyPropertyList(Class cls, unsigned int *outCount) // 属性列表  不包含父类
BOOL class_addMethod(Class cls, SEL name, IMP imp, 
                                 const char *types)  // 动态添加方法  ,如果原先有这个方法,将会返回NO ,表示添加不成功,想覆盖用method_setImplemention

IMP class_replaceMethod(Class cls, SEL name, IMP imp, 
                                    const char *types)  // 如果想要替换的方法不存在 则会 执行add_method ,如果存在 则 method_setImplemention 
 
BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types)  添加变量 只能用在 after objc_allocateClassPair and before objc_registerClassPair. 
BOOL class_addProtocol(Class cls, Protocol *protocol) 、、 添加存在的 ,返回NO 
BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount) 、、 添加存在的返回NO attributes 描述 引用类型,参数类型,
class_replaceProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
 Class objc_allocateClassPair(Class superclass, const char *name,  size_t extraBytes) // 动态创建类  extraBytes  传0 即可
void objc_registerClassPair(Class cls)   // 注册类

SEL method_getName(Method m)  // 获取方法的名称
 
IMP method_getImplementation(Method m) // 获取方法的指针
 
const char *method_getTypeEncoding(Method m)  // 返回方法的返回值,和参数

unsigned int method_getNumberOfArguments(Method m) // 返回方法的参数个数

 
char *method_copyReturnType(Method m)  、、返回方法的返回值。 free() 释放 
 
 char *method_copyArgumentType(Method m, unsigned int index)  、、返回第几个参数 free() 
 
void method_getReturnType(Method m, char *dst, size_t dst_len)  
 
void method_getArgumentType(Method m, unsigned int index, char *dst, size_t dst_len) 

struct objc_method_description  *method_getDescription(Method m) 

IMP method_setImplementation(Method m, IMP imp)  、、 方法的实现 

 
void method_exchangeImplementations(Method m1, Method m2)   // 交换 

const char *ivar_getName(Ivar v) 
const char *ivar_getTypeEncoding(Ivar v) 
const char *property_getName(objc_property_t property)
const char *property_getAttributes(objc_property_t property) 
objc_property_attribute_t *property_copyAttributeList(objc_property_t property, unsigned int *outCount)
 
char *property_copyAttributeValue(objc_property_t property, const char *attributeName)
 
Protocol *objc_getProtocol(const char *name)

Protocol * __unsafe_unretained *objc_copyProtocolList(unsigned int *outCount)

BOOL protocol_conformsToProtocol(Protocol *proto, Protocol *other)
 
BOOL protocol_isEqual(Protocol *proto, Protocol *other)

const char *protocol_getName(Protocol *p)

struct objc_method_description protocol_getMethodDescription(Protocol *p, SEL aSel, BOOL isRequiredMethod, BOOL isInstanceMethod) 、、 协议的 类型 和名称 
 

struct objc_method_description *protocol_copyMethodDescriptionList(Protocol *p, BOOL isRequiredMethod, BOOL isInstanceMethod, unsigned int *outCount)


objc_property_t protocol_getProperty(Protocol *proto, const char *name, BOOL isRequiredProperty, BOOL isInstanceProperty)

objc_property_t *protocol_copyPropertyList(Protocol *proto, unsigned int *outCount)

 

Protocol * __unsafe_unretained *protocol_copyProtocolList(Protocol *proto, unsigned int *outCount)

 Protocol *objc_allocateProtocol(const char *name) 
 
void objc_registerProtocol(Protocol *proto) 

void protocol_addMethodDescription(Protocol *proto, SEL name, const char *types, BOOL isRequiredMethod, BOOL isInstanceMethod) 

 
void protocol_addProtocol(Protocol *proto, Protocol *addition) 

void protocol_addProperty(Protocol *proto, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount, BOOL isRequiredProperty, BOOL isInstanceProperty)

 

const char *sel_getName(SEL sel)  、、
 
// category 添加属性 用到
 void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
id objc_getAssociatedObject(id object, const void *key) 
void objc_removeAssociatedObjects(id object)




最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容