zoukankan      html  css  js  c++  java
  • ObjectiveC如何避免动态绑定,而获得方法地址(函数指针)

     避免动态绑定的唯一办法就是取得方法的地址,并且直接象函数调用一样调用它。当一个方法会被连续调用很多次,而且您希望节省每次调用方法都要发送消息的开销时,使用方法地址来调用方法就显得很有效。

        利用NSObject类中的methodForSelector:方法,您可以获得一个指向方法实现的指针,并可以使用该指针直接调用方法实现。methodForSelector:返回的指针和赋值的变量类型必须完全一致,包括方法的参数类型和返回值类型都在类型识别的考虑范围中。

        下面的例子展示了怎么使用指针来调用setFilled:的方法实现:

    void (*setter)(id, SEL, BOOL);

    int i;

    setter = (void (*)(id, SEL, BOOL))[target

    methodForSelector:@selector(setFilled:)];

    for ( i = 0; i < 1000, i++ ){

    setter(targetList[i], @selector(setFilled:), YES);

    }

    其中setter就是一个IMP类型的变量: id (*IMP)(id, SEL, ...); IMP是一个指向方法实现指针类型。对比一下C环境下面的函数实现指针:

    id anObject, theResult;
    IMP someImp;
    SEL aSelector;
    // ...
    theResult=someImp(anObject,aSelector);

        方法指针的第一个参数是接收消息的对象(self),第二个参数是方法选标(_cmd)。这两个参数在方法中是隐藏参数,但使用函数的形式来调用方法时必须显示的给出。

        使用methodForSelector:来避免动态绑定将减少大部分消息的开销,但是这只有在指定的消息被重复发送很多次时才有意义,例如上面的for循环。

        注意,methodForSelector:是Cocoa运行时系统的提供的功能,而不是Objective-C语言本身的功能。

    http://www.cocoadev.cn/Objective-C/Get-method-address.asp



  • 相关阅读:
    Mybatis深入浅出之工作原理
    Mybatis深入浅出之缓存机制
    Error :Unable to access jarfile *.jar
    Mysql与JDBC版本兼容性问题
    找工作的正确方法
    关于制作云主机基准镜像
    笔记分享
    Android4.0.1找不到R.java
    android 反编译出错 can not merge I and Z
    [论文理解] Improving the imporved training of Wasserstesin GANS: A consistency term and its dual effect
  • 原文地址:https://www.cnblogs.com/ligun123/p/2282478.html
Copyright © 2011-2022 走看看