Objective-C 有种叫做id 的型别,它的运作有时候像是void*,不过它却严格规定只能用在对象。Objective-C 与Java 跟C++ 不一样,你在呼叫一个对象的method 时,并不需要知道这个对象的型别。当然这个method 一定要存在,这称为Objective-C 的讯息传递。Objective-C这点的特性类似javascript。
从这个意义看,id类型是Objective-C特有的引用对象泛型的一种手段。如下的demo:
-(id) init {
self = [super init];
if(self) {
[self setLevel: 10];
}
return self;
}
int main (int argc, const char * argv[]) {
//这里本质上init返回的是id的类型,然后赋值给obj* ,其实是做了一次类型转换。
obj* ob = [[obj alloc] init];
id number;
//赋值给id 类型,然后通过该id进行调用即可。
number = ob;
[number print];
//下面的调用work well
Rectangle *rec = [[Rectangle alloc] initWithWidth: 10 height: 20];
Square *sq = [[Square alloc] initWithSize: 15];
//但下面的会编译失败,注意Square 继承了Rectangle,按照c++的则是ok的,但Objective-c这里是不行,为了能够支持这样的语法,一个做法是Rectangle的构造函数
//initWithWidth的返回值不是Rectangle * 类型,而是改成id类型。
Square *sq = [[Rectangle alloc] initWithWidth: 10 height: 20];
}