zoukankan      html  css  js  c++  java
  • SEL和IMP

    关于Objective-C方法的IMP

    http://blog.csdn.net/swplzj/article/details/17280271

    一.什么是IMP

    IMP是”implementation”的缩写,它是objetive-C 方法(method)实现代码块的地址,可像C函数一样直接调用。通常情况下我们是通过[object method:parameter]或objc_msgSend()的方式向对象发送消息,然后Objective-C运行时(Objective-C runtime)寻找匹配此消息的IMP,然后调用它;但有些时候我们希望获取到IMP进行直接调用。

    二.Objetive-C中的Method结构

    在Objecitve-C中,在类中对每一个方法有一个在运行时构建的数据结构,在Objective-C 2.0中,此结构对用户不可见,但仍在内部存在。

    struct objc_method
    {
      SEL method_name;
      char * method_types;
      IMP method_imp;
    };
    typedef objc_method Method;

    每个方法有3个属性

    • 方法名:方法名为此方法的签名,有着相同函数名和参数名的方法有着相同的方法名。
    • 方法类型:方法类型描述了参数的类型。
    • IMP: IMP即函数指针,为方法具体实现代码块的地址,可像普通C函数调用一样使用IMP。

    由于Method的内部结构不可见,所以不能通过method->method_name的方式访问其内部属性,只能Objective-C运行时提供的函数获取。

    SEL method_getName(Method method);
    IMP method_getImplementation(Method method);
    const char * ivar_getTypeEncoding(Ivar ivar);

    http://www.cnblogs.com/healerkx/archive/2011/12/31/2308932.html

    1. SEL和IMP

    最早我把SEL理解为函数指针,现在看来,不是这样的。

    1.1 SEL类型

    SEL类型的变量,可以通过@selector(方法名)来取得,当然了,Objective C的方法名,我们也知道了,多么恶心(比Java废话还多)。

    而它真正得到的,只要方法名一样,它的值就是一样的,不管这个方法定义于哪个类,是不是实例方法【再说了,@selector的时候,除了方法名也没有什么类啊,对象啊什么事情】。

    所以我现在把它理解为“方法名的某种映射结果”。(从C++程序员的眼光看,我觉得没啥可以对应的,既不是函数指针,也不是函数指针类型,像是函数指针类型的名字吧。)

    1.2 IMP类型

    这个才是函数指针,IMP可以从 对象 & SEL的方法得到:

    IMP imp = [self methodForSelector:selector];

    这是IMP的定义:

    typedef id (*IMP)(id, SEL, );

    另外注意NSObject里面的这两个方法:

    - (IMP)methodForSelector:(SEL)aSelector;
    + (IMP)instanceMethodForSelector:(SEL)aSelector;

     

    2. Objective C可以动态添加方法...

    class_addMethod,用就行了,转到定义,可以看看其他的方法,也很动态(这也太动态了,Java,C#也不行啊)。

    "定义于runtime.h"

     

    3. resolveInstanceMethod

    这个方法挺BT的。


    我暂时个人理解为方法劫持吧,方法和属性的调用,都会先跑到这里来,具体看文档吧:
    http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/chapter_5_section_2.html

    4. 模拟NSManagedObject

  • 相关阅读:
    SuperMap房产测绘成果管理平台
    SuperMap产权登记管理平台
    Android adb shell am 的用法(1)
    由浅入深谈Perl中的排序
    Android 内存监测和分析工具
    Android 网络通信
    adb server is out of date. killing...
    引导页使用ViewPager遇到OutofMemoryError的解决方案
    adb logcat 详解
    How to send mail by java mail in Android uiautomator testing?
  • 原文地址:https://www.cnblogs.com/HypeCheng/p/4598398.html
Copyright © 2011-2022 走看看