zoukankan      html  css  js  c++  java
  • ObjectiveC中的数据类型

    Objective-C中,有一些我们之前并不熟悉但是经常见到的数据类型,比如id、nil、Nil、SEL等等。在很多文章里,我们都见过这些数据类型的介绍,但是都没有说的太清楚。
     
    这篇文章从最底层的定义开始,介绍一下这些类型到底是怎么定义的,这会帮助我们更加深入地了解Objective-C。

     
    原文作者为Greg Miller,文章地址在:
    http://unixjunkie.blogspot.com/2006/02/nil-and-nil.html
     
    Objective-C中有一些很有趣的数据类型经常会被错误地理解。他们中的大多数都可以在/usr/include/objc/objc.h或者这个目录中的其他头文件中找到。下面是从objc.h中摘录的一段,定义了一些数据类型:
     
        1.    // objc.h
        2.     
        3.    typedef struct objc_class *Class;
        4.     
        5.    typedef struct objc_object {
        6.      Class isa;
        7.    } *id;
        8.     
        9.    typedef struct objc_selector  *SEL;
        10.    typedef id      (*IMP)(id, SEL, …);
        11.    typedef signed char   BOOL;
        12.     
        13.    #define YES             (BOOL)1
        14.    #define NO              (BOOL)0
        15.     
        16.    #ifndef Nil
        17.    #define Nil 0   /* id of Nil class */
        18.    #endif
        19.     
        20.    #ifndef nil
        21.    #define nil 0   /* id of Nil instance */
        22.    #endif
     
    我们在这里解释一下它们的细节:
     
    id
     
    id 和void *并非完全一样。在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。需要注意的是id 是一个指针,所以你在使用id的时候不需要加星号。比如id foo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id *foo=nil则定义了一个指针,这个指针指向另一个指针,被指向的这个指针指向NSObject的一个子类。
     
    nil
     
    nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。
     
    Nil
     
    首字母大写的Nil和nil有一点不一样,Nil定义一个指向空的类(是Class,而不是对象)。
     
    SEL
     
    这个很有趣。SEL是“selector”的一个类型,表示一个方法的名字。比如以下方法:
     
    -[Foo count] 和 -[Bar count] 使用同一个selector,它们的selector叫做count。
     
    在上面的头文件里我们看到,SEL是指向 struct objc_selector的指针,但是objc_selector是什么呢?那么实际上,你使用GNU Objective-C的运行时间库和NeXT Objective-C的运行运行时间库(Mac OS X使用NeXT的运行时间库)时,它们的定义是不一样的。实际上Mac OSX仅仅将SEL映射为C字符串。比如,我们定义一个Foo的类,这个类带有一个- (int) blah方法,那么以下代码:
     
        1.    NSLog (@"SEL=%s", @selector(blah));
     
     
    会输出为 SEL=blah。
     
    说白了SEL就是返回方法名。

    IMP
     
    从上面的头文件中我们可以看到,IMP定义为 id (*IMP) (id, SEL, …)。这样说来, IMP是一个指向函数的指针,这个被指向的函数包括id(“self”指针),调用的SEL(方法名),再加上一些其他参数。
     
    说白了IMP就是实现方法。
     
    Method
     
    在objc/objc-class.h中定义了叫做Method的类型,是这样定义的:
     
        1.    typedef struct objc_method *Method;
        2.    struct objc_method {
        3.      SEL method_name;
        4.      char *method_types;
        5.      IMP method_imp;
        6.    };
     
     
     
    这个定义看上去包括了我们上面说过的其他类型。也就是说,Method(我们常说的方法)表示一种类型,这种类型与selector和实现(implementation)相关。
     
    Class
     
    从上文的定义看,Class(类)被定义为一个指向struct objc_class的指针,在objc/objc-class.h中它是这么定义的:
     
        1.    struct objc_class {
        2.      struct objc_class *isa;
        3.      struct objc_class *super_class;
        4.      const char *name;
        5.      long version;
        6.      long info;
        7.      long instance_size;
        8.      struct objc_ivar_list *ivars;
        9.      struct objc_method_list **methodLists;
        10.      struct objc_cache *cache;
        11.      struct objc_protocol_list *protocols;
        12.    };
     
  • 相关阅读:
    Martix工作室考核题 —— 打印一个菱形
    Martix工作室考核题 —— 打印一个菱形
    Martix工作室考核题 —— 打印九九乘法表
    Martix工作室考核题 —— 打印九九乘法表
    Martix工作室考核题 —— 打印九九乘法表
    Martix工作室考核题 —— 201938 第三题
    Martix工作室考核题 —— 201938 第三题
    Martix工作室考核题 —— 201938 第三题
    Martix工作室考核题 —— 201938 第一题
    fiddler模拟发送post请求
  • 原文地址:https://www.cnblogs.com/mac_arthur/p/1708346.html
Copyright © 2011-2022 走看看