码迷,mamicode.com
首页 > 移动开发 > 详细

自学ios开发-------Objective-c动态调用方法笔记

时间:2015-08-21 12:55:35      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!