标签:
OC动态调用
OC的函数调用是消息发送模式,即在运行时动态调用函数,OC在编译期可以调用任何函数,只要声明过这个函数,就不会报错,在真正运行的时候
才会根据函数的名称找到对应的函数来调用
[ASPerson SayHello]
编译时RunTime会将上述代码转化为
objc_msgSend(ASPerson @selector(SayHello))
所有定义的类型都继承自NSObject,NSObject中存在一个指向Class的指针
Class是指向objc_class结构的函数指针;
struct objc_class{ Class isa; Class super_class; const charchar *name; long version; long info; long instance_size; struct objc_ivar_list *ivars; struct objc_method_list **methodLists; struct objc_cache *cache; struct objc_protocol_list *protocols; }
Class isa :Obj对象中包含一个isa,指向一般的Class,这个Class包含一般的变量和对象方法,
一般Class中的isa指向metaClass,静态Class中存储的是静态的对象(static)成员和类方法.
Class super_class:指向父类,如果这个类是根类,则为NULL
图
metaclass中的isa指向根Root metaclass而不是super metaclass
Root metaclass继承Root class产生,Root metaclass指向的是自身
const char *name: 类名
long version: 类的版本信息,默认为0
long info:供运行期使用的一些位标识,如CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含对象方法和成员变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;
long instance_size: 该类的实例变量大小(包括从父类继承下来的实例变量);
struct objc_ivar_list *ivars: 指向成员变量结构体的函数指针 struct objc_ivar_list { int ivar_count; 成员变量的数量 struct objc_ivar ivar_list[1]; objc_ivar中包含一般Class的成员变量 }
struct objc_method_list **methodLists :指向方法链表结构体的函数指针
struct objc_method_list { struct objc_method_list *obsolete; 已经废弃的方法 int method_count; 方法的数量 struct objc_method method_list[1]; 方法链表结构体 }
struct objc_cache *cache:指向最近使用的方法的指针,下次再访问的时候回先在cache中查找
struct objc_cache { unsigned int mask /* total = mask + 1 */; unsigned int occupied; Method buckets[1]; };
struct objc_protocol_list *protocols: 存储该类遵守的协议
struct objc_protocol_list { struct objc_protocol_list *next; long count; Protocol *list[1]; };
SEL类型:
方法选择器类:可以通过方法的名字找到对应方法的指针,每一个方法都有一个SEL,
如果方法名相同,多个方法对应的SEL还是一样的
动态调用方法过程:
函数在调用的时候通过isa找到对应的class,然后现在cache表中通过SEL查找对应method的地址,如果没有找到,再去method列表
中找,如果还没有找到,就在superClass中去找,逐级查找,如果找到了,将这个method地址放在cache中,然后执行这个方法
自学ios开发-------Objective-c动态调用方法笔记
标签:
原文地址:http://www.cnblogs.com/wuxian781999/p/4747443.html