我(想)學習Objective-C,我不斷跨越一個短語來,如:id是什麼意思?
-(id) init;
據我所知id
是客觀存在的C語言的關鍵字,但是這是什麼意思說「編譯器專根據指針類型轉換規則處理id
「?
id
是否自動指定對象作爲指針?
我(想)學習Objective-C,我不斷跨越一個短語來,如:id是什麼意思?
-(id) init;
據我所知id
是客觀存在的C語言的關鍵字,但是這是什麼意思說「編譯器專根據指針類型轉換規則處理id
「?
id
是否自動指定對象作爲指針?
id
是指向任何類型的指針,但不像void *
它總是指向一個Objective-C對象。例如,您可以將任何類型的文件id
添加到NSArray,但這些對象必須響應retain
和release
。
編譯器非常高興讓您隱式地將任何對象轉換爲id
,並且您可以將id
轉換爲任何對象。這與Objective-C中的任何其他隱式轉換不同,並且是可可中大多數容器類型的基礎。
補充:'id'的定義是'typedef struct objc_object * id;',所以它指向一個'Objc'對象。 – zhongwuzw
id
是一種通用類型。這意味着編譯器會預期任何對象類型,並且不會強制執行限制。如果你期望在那裏使用多於一類的對象,這會很有用;然後你可以使用自省來找出它是哪一類。因爲Objective-C中的所有對象都是作爲指針/引用傳遞的,所以id
自動承擔一個指針。
一些其他資源:
id vs NSObject vs id*
Objective-C Programming (Wikibooks)
Introspection
Dynamic Typing
id
是一個指向任何Objective-C的對象(objc_object
)。它不僅僅是一個空指針,你不應該這樣對待它。它引用一個對象,該對象應該有一個有效的isa
指針。可以存儲在id
中的值也不僅限於NSObject
及其後代,它開始意識到NSObject
協議的存在以及NSProxy
類,它甚至不從NSObject
繼承。編譯器將允許您將類型爲id
的對象分配給任何對象類型,將任何對象類型分配給id
,並向其發送任何消息(編譯器已經看到),而不發出警告。
是和否。確實有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?
在Java或C#,我們使用這樣
Object data = someValue;
String name =(Object)data;
但在目標C
id data= someValue;
NSString *name= data;
這是自我的對面。對於一些人是'void *' –
這裏是一個與這個問題相關的討論:[SO問題](http://stackoverflow.com/questions/8972221/would-it-be-beneficial-to-begin-using-instancetype -id ID/14652187#14652187) – dmitri