Objective-C中的一些特殊的數據類型 id、nil、Nil、SEL

Objective-C中有一些很有趣的數據類型經常會被錯誤地理解。他們中的大多數都可以在/usr/include/objc/objc.h或者這個目錄中的其他頭文件中找到。下面是從objc.h中摘錄的一段,定義了一些數據類型:


// objc.h

  1. typedef struct objc_class*Class;

  2. typedef struct objc_object{

  3. Class isa;

  4. } *id;


  5. typedef struct objc_selector*SEL;

  6. typedef id (*IMP)(id,SEL, …);

  7. typedef signed char BOOL;


  8. #define YES(BOOL)1

  9. #define NO(BOOL)0


  10. #ifndef Nil

  11. #define Nil 0

  12. #endif


  13. #ifndef nil

  14. #define nil 0

  15. #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,而不是對象)。


NULL: A null pointer to anything else,  is for C-style memory pointers. 用於對非對象指針賦空值,比如C指針

NSNull :對於像NSArray這樣的類型,nil或NULL不能做爲加到其中的Object,如果定義了一個NSArray,爲其分配了內存,又想設置其中的內容爲空,則可以用[NSNULL null】返回的對象來初始化NSArray中的內容。


SEL


這個很有趣。SEL是“selector”的一個類型,表示一個方法的名字。比如以下方法:


-[Foocount] 和 -[Barcount] 使用同一個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. };


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章