首先先说一个简书作者的博客,把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./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./2014/03/06/ios_exam_0_key/ |
|
来自: shijingfulwpqz > 《文件夹1》