Objective-C Runtime (二)
2015-08-16 00:08
501 查看
前篇的代码已经让我们感受到了runtime的诡异,现在让我们分析几行代码
//1.载入内存的时候调用 + (void)load{ /*2.单例代码块,保证代码块中的代码只运行一次*/ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ /*3.得到描述一个类的结构体地址 typedef struct*/ objc_class *Class Class class = [self class]; /*4.得到两个 sel 其实就是函数指针入口,但是我感觉这里像是消息,就是一个标记(字符串),其值在一个类的结构描述中,是唯一的 */ SEL originalSelector = @selector(viewWillAppear:); SEL swizzledSelector = @selector(hehe:); /*5.得到实现方法的实例 地址 也就是存放在 这个class objc_method_list 方法列表中的地址,这里想当然 用 class 这个地址 加 标示地址,的地址*/ Method originalMethod = class_getInstanceMethod(class , originalSelector); Method swizzledMethod = class_getInstanceMethod(class , swizzledSelector); /*6.将一个方法添加到这个类的objc_method_list 也就是注册,SEL 是发送的消息,也就是objc_msgSend(object, @selector(message)); 试想一下 SEL 就是一个字符串,也就是 key, 那么 value 就是 swizzledMethod 执行的地址*/ /* 添加到 6.1.class (描述类的结构体首地址), 6.2.SEL 表示唯一标示, 6.3.IMP :函数指针,实现消息的方法, method_getImplementation(swizzledMethod) 是实现 swizzledMethod 这个方法的地址 6.4.const char * 相信大家对 int main(int argc, char * argv[]) 这个都清楚吧, 描述参数 和返回值 类型 */ BOOL didAddMethod = class_addMethod(class , originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); /*7 如果添加成功,那么就替换自身的消息,hehe:YES 就会执行 系统的 viewWillAppear*/ if (didAddMethod) { class_replaceMethod(class , swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod) ); /*8.如果添加没成功,那么就交换两个实现方法*/ }else { method_exchangeImplementations(originalMethod, swizzledMethod); } }); }
相关文章推荐
- 《Objective-C基础教程》第13章 协议
- Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:
- struts.objectFactory和struts.objectFactory.spring.autoWire
- iOS开发核心语言Objective C语言 —— 特有语法及设计模式
- C以及Objective-C测试题讲解(下)
- C以及Objective-C测试题讲解(上)
- Objective-C Category 、 Extension 、 非正式协议 及Block的使用
- Objective-C(二、类和对象)
- swift学习笔记一: 调用Objective-C代码
- Objective-C(一简介)
- iOS开发-通过 objc_setAssociatedObject alert 和 button关联 及传值
- WordPress固定链接修改报错:Object not found的解决方法
- Objective-C:三种文件导入的方式比较
- QAxObject操作Excel表格
- Effective Objective-C Notes:GCD 实现同步锁
- iOS开发:Objective-C精确的货币计算
- 《Objective-C基础教程》第12章 类别
- Objective-C 苹果开发文档 04 Encapsulating Data
- C++对象模型——对象复制语意学 (Object Copy Semantics)(第五章)
- '[<NSObject 0x8a4b500> setValue:forUndefinedKey:]