b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

面向对象开发过程 iOS开发:Runtime解析(3)

电脑杂谈  发布时间:2018-02-20 21:52:40  来源:网络整理

} OBJC2_UNAVAILABLE;

// 方法列表

struct objc_method_list {

struct objc_method_list *obsolete OBJC2_UNAVAILABLE;

int method_count OBJC2_UNAVAILABLE;

#ifdef __LP64__

int space OBJC2_UNAVAILABLE;

#endif

/* variable length structure */

struct objc_method method_list[1] OBJC2_UNAVAILABLE;

}

由此可见,我们可以动态修改 *methodList的来添加成员方法,这也是Category实现的原理,同样解释了Category不能添加属性的原因。

objc_ivar_list结构体用来存储成员变量的列表,而objc_ivar则是存储了单个成员变量的信息;同理,objc_method_list结构体存储着方法数组的列表,而单个方法的信息则由objc_method结构体存储。

得注意的时,objc_class中也有一个isa指针,这说明OC类本身也是一个对象。为了处理类和对象的关系,Runtime 库创建了一种叫做 Meta Class(元类) 的东西,类对象所属的类就叫做元类。Meta Class表述了类对象本身所具备的元数据。

我们所熟悉的类方法,就源自于Meta Class。我们可以理解为类方法就是类对象的实例方法。每个类仅有一个类对象,而每个类对象仅有一个与之相关的元类。

当你发出一个类 [NSObject alloc](类方法) 的消息时,实际上这个消息被发送给了一个类对象(Class Object),这个类对象必须是一个元类的实例,而这个元类同时也是一个根元类(Root Meta Class)的实例。所有元类的 isa指针最终都指向根元类。

所以当 [NSObject alloc] 这条消息发送给类对象的时候,运行时代码 objc_msgSend() 会去它元类中查找能够响应消息的方法实现,如果找到了,就会对这个类对象执行方法调用。

最后 objc_class中还有一个objc_cache ,缓存。

4.Method

Method 代表类中某个方法的类型

typedef struct objc_method *Method;

struct objc_method {

SEL method_name OBJC2_UNAVAILABLE;

char *method_types OBJC2_UNAVAILABLE;

IMP method_imp OBJC2_UNAVAILABLE;

}

objc_method 存储了方法名,方法类型和方法实现:

方法名类型为 SEL

方法类型 method_types 是个 char 指针,存储方法的参数类型和返回类型

method_imp 指向了方法的实现,本质是一个函数指针

Ivar

Ivar 是表示成员变量的类型。

typedef struct objc_ivar *Ivar;


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-86234-3.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...