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;