Objective-C中的資料類型

來源:互聯網
上載者:User
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.    };
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.