【问题标题】:Pre-binding message to avoid method lookup预先绑定消息以避免方法查找
【发布时间】:2012-06-01 05:41:50
【问题描述】:

这篇文章http://www.gnustep.org/resources/ObjCFun.html指出

在任何时间很关键的地方,Objective-C 都可以将消息预先绑定到其实现中,从而避免昂贵的消息查找。

您如何进行此预绑定?这与选择器无关,是吗?

【问题讨论】:

    标签: objective-c message prebinding


    【解决方案1】:

    它涉及实现。 考虑以下因素(如果您获得参考,则 +1 互联网):

    NSArray *myReallyLongArrayOf1000items;
    
    for (int i = 0; i < 1000; i++)
        NSLog(@"%@", [myReallyLongArrayOf1000items objectAtIndex:i]);
    

    obj-c 运行时需要时间来准确查找如何执行-objectAtIndex: 任务。因此,当我们将代码块更改为:

    NSArray *myReallyLongArrayOf1000items;
    
    id (*objectAtIndex)(NSArray *, SEL, int) = (typeof(objectAtIndex)) [myReallyLongArrayOf1000items methodForSelector:@selector(objectAtIndex:)];
    
    for (int i = 0; i < 1000; i++)
        NSLog(@"%@", objectAtIndex(myReallyLongArrayOf1000items, @selector(objectAtIndex:), i);
    

    这使用了一个 C 函数指针,它比使用 Objective-c 动态查找要快得多,因为它只是调用方法,并且没有额外的运行时代码。

    不利的一面是,这很快会使代码难以阅读,因此请谨慎使用,如果有的话。

    【讨论】:

    • 它不仅使代码难以阅读,而且绕过了可以通过多种方式改变行为的调度。总的来说,几乎从不有这样做的理由。当您认为自己可能有理由这样做时,更好的解决方案几乎总是重新审视周围代码中使用的架构/算法。
    • @bbum:是的,但我想这些重写通常意味着更低的封装,我认为这是一种耻辱。
    • 同意;在我看到使用 IMP 缓存的 99% 的时间里,它都是不必要的。现实情况是,IMP 缓存本身会破坏封装(即,如果您在缓存 IMP 后安装 KVO 观察器,您将获得错误的 IMP)。
    猜你喜欢
    • 2015-08-20
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    相关资源
    最近更新 更多