OC方法设置的效率

OC中method_setImplementation和method_exchangeImplementations,由于涉及到类方法缓存的清理问题,需要对某一个类的所有子类进行方法缓存清理。但是这两个方法的默认实现是从根类开始遍历,也就是说,如果使用了这两个方法,那么runtime会遍历整个类树,执行方法缓存清理,rumtime工作量很大。

IMP 
method_setImplementation(Method m, IMP imp)
{
    // Don't know the class - will be slow if RR/AWZ are affected
    // fixme build list of classes whose Methods are known externally?
    mutex_locker_t lock(runtimeLock);
    return _method_setImplementation(Nil, m, imp);
}
static IMP 
_method_setImplementation(Class cls, method_t *m, IMP imp)
{
    // 此处省略无关代码

    // Cache updates are slow if cls is nil (i.e. unknown)
    // RR/AWZ updates are slow if cls is nil (i.e. unknown)
    // fixme build list of classes whose Methods are known externally?

    flushCaches(cls, __func__, [sel, old](Class c){
        return c->cache.shouldFlush(sel, old);
    });

    // 此处省略无关代码
}
void method_exchangeImplementations(Method m1, Method m2)
{

    // 此处省略无关代码

    // RR/AWZ updates are slow because class is unknown
    // Cache updates are slow because class is unknown
    // fixme build list of classes whose Methods are known externally?

    flushCaches(nil, __func__, [sel1, sel2, imp1, imp2](Class c){
        return c->cache.shouldFlush(sel1, imp1) || c->cache.shouldFlush(sel2, imp2);
    });

    // 此处省略无关代码
}

两个方法最终都是使用了flushCaches实现,该方法在未传入cls的情况下,会从NSObject开始遍历,会遍历所有的类,苹果文档里面的备注也说明了这一点

static void flushCaches(Class cls, const char *func, bool (^predicate)(Class))

虽然在遍历的过程中,有了根据缓存判断,需不需要清理的过程,但是如果项目中的类过多,每次设置,效率还是很低下的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 注:文中问题摘自: https://www.jianshu.com/p/8345a79fd572https://j...
    Will_Z_jwz阅读 410评论 1 1
  • 方法缓存 其实这个文章网上有很多解释也有很多人写过相关文章,但是我还是有一些疑问,所以我打算从另外一个角度来学习一...
    佛祖拿屠刀阅读 1,304评论 0 0
  • 1.为什么说Objective-C是一门动态的语言? 一、动态语言,是指在程序运行时能够改变其结构,新的函数可以被...
    年轻就要活出样阅读 485评论 0 1
  • 上篇我们讲到了runtime 的动态添加属性和方法,遍历对象的属性列表,今天我们来讲一下runtime里面更好用的...
    陈贺年阅读 529评论 0 3
  • 1.一个objc对象的isa的指针指向什么?有什么作用? 指向他的类对象,从而可以找到对象上的方法 详解:下图很好...
    長茳阅读 392评论 0 8