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;