首先先说一个简书作者的博客,把runtime入门讲得够清晰。
http://www.jianshu.com/p/25a319aee33d
Objective-C语言使用了面向对象特性和消息转发机制。
一:Runtime的数据结构:
解析:Root class其实就是NSObject,NSObject是没有超类的,所以Root class 的superclass指向nil;
每一个Class都有一个isa指针指向唯一的Meta class;
Root class(meta)的superclass指向Root class,也就是NSObject,形成一个回路;
每个Meta class的isa指针都指向Root class(Meta);
注意: 不论是示例对象还是Class,都是id类型的对象(Class同样是对象)
示例对象的isa指向它的Class(储存所有减法方法),Class对象isa指向元类(储存所有加好方法)
向一个对象(id)类型发送消息时,都是从这个对象的isa指针指向的Class中寻找方法
methodLists表示方法列表,他是指向objc_method_list结构体的二级指针,可以动态修改*methodLists的值来添加成员方法,也是category实现原理,同样也解析category不能添加示例变量的原因。
(二级指针相关阅读:http://www.fenesky.com/blog/2014/07/03/pointers-to-pointers.html)
@implementation Son : Father- (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringFromClass([self class])); NSLog(@"%@", NSStringFromClass([super class])); } return self; }@end
两个都是输出son,具体看文章解析。
二:关于消息转发机制:
关于这个的一些比较基础的用法可以在另外一个例子直接看到:
http://my.oschina.net/caijunrong/blog/508738
这三种方法的选择时机作者说:
Method Resolution:由于Method Resolution不恩能够像消息转发那样可以交给其他对象来处理,所以只能适用在 原来的类中替代掉;
Fast Forwarding:它可以将消息处理转发给其它对象,使用范围更广,不只是限于原来的对象;
Normal Forwarding: 它跟Fast Forwarding一样可以消息转发,单它能通过NSInvocation对象获取更多消息发送的信息,例如:target、selector、arguments和返回值等信息。
三:关于怎么使用Category对已存在的类别进行扩展,一般只能添加示例方法货类方法,因为二级指针的原因,而不适合添加额外的属性。虽然可以在category头文件中声明property属性,但在实现文件中编译器是无法synthesize任何示例变量和属性访问方法。这时需要自定义属性访问方法,并且使用Associatd Objects来给已经存在的类Category添加自定义的属性。
Associated Objects提供三个API来向对象添加、获取和删除关联值:
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 )
笔试题:
iOS6级:
http://blog.sunnyxx.com/2014/03/06/ios_exam_0_key/