Objective-C 运行时

OC Runtime:
材料文章参考
Runtime
OC运行时的意义在于一切方法的调用不是在编译时就决定好的,要通过运行时最终决定,非常灵活。
1.运行时动态检查该对象及其父对象(dispatch table)是否包含改方法。
2.没有的话进入动态方法解析和转发阶段
2.1 +resolveInstanceMethod: 检查是否对方法处理,可通过添加新的方法实现
2.2 -forwardingTargetForSelector: 可将相应方法目标转发到其他对象上
2.3-methodSignatureForSelector:最后一次机会生成新的方法签名调用,之后系统生成NSInvocation,可以进一步在-forwardInvocation通过判断.selector属性进行相应的invocation的target修改或者方法的直接调用

objectivec-runtime-overview-39-638.jpg

Swizzle: 相关资料
本质上Swizzle是利用到OC Runtime的第一步中的dispatch table(记录了objc_method(SEL/char/IMP)) 的互换实现的。
方法替换:

    Method originalMethod = class_getInstanceMethod(self, @selector(viewWillAppear:));
    Method swizzledMethod = class_getInstanceMethod(self, @selector(fd_viewWillAppear:));
    method_exchangeImplementations(originalMethod, swizzledMethod);

替换方法实现:

- (void)fd_viewWillAppear:(BOOL)animated
{
    // Forward to primary implementation.
    [self fd_viewWillAppear:animated];
    
    if (self.fd_willAppearInjectBlock) {
        self.fd_willAppearInjectBlock(self, animated);
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Objective-C运行时可以干什么 利用运行时,我们可以做一些OC不容易实现的功能,比如: 动态交换两个方法的...
    _我和你一样阅读 2,425评论 0 0
  • 摘要 无论一个类设计的多么完美,在未来的需求演进中,都有可能会碰到一些无法预测的情况。那怎么扩展已有的类呢?一般而...
    癫癫的恋了阅读 4,654评论 0 6
  • 简介 Objective-C将很多静态语言在编译和链接时做的事放到了运行时来处理。只要有可能,它做了一些动态。这意...
    木夜溯阅读 5,622评论 0 11
  • 3月8号周三,涵宝美工课结束后和我一起回家,骑到半路电单车没电了,蹬得很费力。涵宝下车在后面帮忙推车子,一会儿跑前...
    pan02阅读 1,081评论 0 0
  • 我是一名初三学生,每天在学校计算着中考还有多少天会来到,回到家里还是想着中考,我想不明白为什么我国要用这种方法选拔...
    佳丽丽阅读 1,733评论 0 0

友情链接更多精彩内容