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;