2011-11-02 216 views
63

我(想)學習Objective-C,我不斷跨越一個短語來,如:id是什麼意思?

-(id) init; 

據我所知id是客觀存在的C語言的關鍵字,但是這是什麼意思說「編譯器專根據指針類型轉換規則處理id「?

id是否自動指定對象作爲指針?

+20

這是自我的對面。對於一些人是'void *' –

+0

這裏是一個與這個問題相關的討論:[SO問題](http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -id ID/14652187#14652187) – dmitri

回答

79

id是指向任何類型的指針,但不像void *它總是指向一個Objective-C對象。例如,您可以將任何類型的文件id添加到NSArray,但這些對象必須響應retainrelease

編譯器非常高興讓您隱式地將任何對象轉換爲id,並且您可以將id轉換爲任何對象。這與Objective-C中的任何其他隱式轉換不同,並且是可可中大多數容器類型的基礎。

+0

補充:'id'的定義是'typedef struct objc_object * id;',所以它指向一個'Objc'對象。 – zhongwuzw

17

id是一種通用類型。這意味着編譯器會預期任何對象類型,並且不會強制執行限制。如果你期望在那裏使用多於一類的對象,這會很有用;然後你可以使用自省來找出它是哪一類。因爲Objective-C中的所有對象都是作爲指針/引用傳遞的,所以id自動承擔一個指針。

一些其他資源:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing

26

id是一個指向任何Objective-C的對象(objc_object)。它不僅僅是一個空指針,你不應該這樣對待它。它引用一個對象,該對象應該有一個有效的isa指針。可以存儲在id中的值也不僅限於NSObject及其後代,它開始意識到NSObject協議的存在以及NSProxy類,它甚至不從NSObject繼承。編譯器將允許您將類型爲id的對象分配給任何對象類型,將任何對象類型分配給id,並向其發送任何消息(編譯器已經看到),而不發出警告。

4

是和否。確實有id x將x指定爲指針,但是指出指針類型轉換規則適用是錯誤的,因爲「id」具有特殊的類型轉換規則。例如,具有void *指針,你不能做到這一點:

void *x; 
char *y = x; // error, this needs an explicit cast 

相反,它可能與ID:

id x; 
NSString *y = x; 

id in objective c examples類型的更多使用。

另外在「現代」Objective C中,最好使用instancetype而不是「init」方法中的「id」。 Xcode中甚至還有一個自動轉換工具來改變它。閱讀關於instancetype :Would it be beneficial to begin using instancetype instead of id?

3
  • 「ID」是Objective-C的對象標識符,它可以 是用於任何類型的對象,不管它有什麼類的數據類型。 「id」是所有對象的最終超類型。

在Java或C#,我們使用這樣

Object data = someValue; 


String name =(Object)data; 

但在目標C

id data= someValue; 



NSString *name= data;