ID

id 是通用物件指標,是表示任何物件的 Objective-C 型別。任何 Objective-C 類的例項都可以儲存在 id 變數中。可以在不進行轉換的情況下來回分配 id 和任何其他類型別:

id anonymousSurname = @"Doe";
NSString * surname = anonymousSurname;
id anonymousFullName = [NSString stringWithFormat:@"%@, John", surname];

從集合中檢索物件時,這變得相關。正是出於這個原因,像 objectAtIndex:這樣的方法的返回型別才是 id

DataRecord * record = [records objectAtIndex:anIndex];  

它還意味著輸入為 id 的方法或函式引數可以接受任何物件。

當一個物件被輸入為 id 時,任何已知的訊息都可以傳遞給它:方法分派不依賴於編譯時型別。

NSString * extinctBirdMaybe = 
               [anonymousSurname stringByAppendingString:anonymousSurname];

當然,物件實際上沒有響應的訊息仍會在執行時導致異常。

NSDate * nope = [anonymousSurname addTimeInterval:10];
// Raises "Does not respond to selector" exception

防止異常。

NSDate * nope;
if([anonymousSurname isKindOfClass:[NSDate class]]){
    nope = [anonymousSurname addTimeInterval:10];
}

id 型別在 objc.h 中定義

typedef struct objc_object {
    Class isa;
} *id;