zoukankan      html  css  js  c++  java
  • OC学习笔记 id类型

    id是oc语言中一个独特的数据类型。一种通用对象类型。可以转换为任何数据类型,即id类型的变量可以存放任何数据类型的对象。

    万能指针,能指向操作任何OC对象 id ==NSObject *

    这是为什么呢?还是从OC的内部实现机制上来分析吧!

             在内部处理上,id类型被定义为指向对象的指针,这可以从id的定义中看出。id在objc.h中的定义为:

    1 typedef struct objc_object {
    2     Class isa;
    3 } *id;

    而Class为typedef struct objc_class *Class,即Class为struct objc_class的指针别名,而objc_class在runtime.h中的定义为

     1 struct objc_class {
     2     Class isa;
     3 #if !__OBJC2__
     4     Class super_class                                        OBJC2_UNAVAILABLE;
     5     const char *name                                         OBJC2_UNAVAILABLE;
     6     long version                                             OBJC2_UNAVAILABLE;
     7     long info                                                OBJC2_UNAVAILABLE;
     8     long instance_size                                       OBJC2_UNAVAILABLE;
     9     struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    10     struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    11     struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    12     struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
    13 #endif
    14 
    15 } OBJC2_UNAVAILABLE;

    从上面的代码看出,id是指向objc_object的一个指针。那么它为什么可以指向NSObject对象呢?还是看NSObject的定义吧!

    1 @interface NSObject <NSObject> {
    2     Class    isa;
    3 }

    可以看出NSObject只有一个Class对象isa,而objc_object也是只有一个Class对象isa,可以看成两者等价(不知道对不对?)。所以id是一个一个比较灵活的对象指针,并且是一个指向任何一个继承了Object(或者NSObject)类的对象。而在cocoa的开发环境里,NSObject是所有类的根类。所以id可以指向任何一个cocoa的合法对象。

    从上面的代码分析可以看出,id实际上是一个指向NSObjec对象的实例变量的指针,即id和void*并非完全一样。

    PS:id和IMP标志符之间的关系:

        id:是一种数据类型;

        IMP:指向返回id类型值的方法的指针,而且指向的方法带有self和selector对象作为第一个参数。它是一种C类型,可以认为是一种函数指针。其英文解释:IMP is a C type referring to the implementation of a method, also known as an implementation pointer. It's a pointer to a function returning id, and with self and a method selector (available inside method definitions as the variable _cmd) as the first arguments。

    其使用方法为:id (*IMP)(id, SEL, ...);(SEL为选择器selector的一个类型,选择器就是指向方法的一个指针)

    对于NSObject对象,你可以这样来获得一个给定方法的IMP:
    IMP imp=[obj methodForSelector:@selector(message)];
    对于任意的对象object,
    IMP imp=[obj methodFor:@selector(message)];

  • 相关阅读:
    什么时间调用 UpdateData() MFC函数
    网页页面内跳转
    关于SVG文件在Firefox中正确显示的研究
    火车座位号分布情况
    使用“性能监视器”监视系统性能/运行情况
    SQL Server Cache Manager
    SQL连接:localhost、127.0.0.1、(local)的区别
    SQL Server如何保证可空字段中非空值唯一
    SQL 2005使用正则表达式
    從數據讀取資料方法
  • 原文地址:https://www.cnblogs.com/zhangdashao/p/4452144.html
Copyright © 2011-2022 走看看