首先先说一个简书作者的博客,把runtime入门讲得够清晰。

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不能添加示例变量的原因。


@implementation Son : Father- (id)init
{    self = [super init];    if (self)
    {        NSLog(@"%@", NSStringFromClass([self class]));        NSLog(@"%@", NSStringFromClass([super class]));
    }    return self;
}@end
@implementation Son : Father- (id)init
{    self = [super init];    if (self)
    {        NSLog(@"%@", NSStringFromClass([self class]));        NSLog(@"%@", NSStringFromClass([super class]));
    }    return self;
}@end

        两个都是输出son,具体看文章解析。

二:关于消息转发机制:

关于这个的一些比较基础的用法可以在另外一个例子直接看到:

 

这三种方法的选择时机作者说:

        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 )
  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 )