———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
id 是万能指针,能指向\操控任何OC对象
id类型的定义:
typdef struct objc object{
Class isa;
} *id;
注意:
1. 因为id是一种类型,所以不可以写 id id; 就像是不可以写 int int; 一样,关键字不可以做标识符。
2. id内部已经包含*了,所以在id类型后面不需要再加*了。
id == NSObject * id相当于NSObject *
因为凡是OC对象都是由指针来操作的,而大多数OC对象基本上都是继承自NSObject,如下:
NSObject *o = [Person new]; // 可以用父类指针指向子类对象,也就是多态,而id是万能指针,能指向并操作任何OC对象,所以id相当于NSObject *,因此任何继承NSObject类的对象都可以用id来着操作。
如果在Person类的声明中使用@property声明一个id类型的变量
@property id obj; // 说明成员变量是id类型的,任何OC对象都可以作为他的属性
那么在主函数中调用的时候可以传任何OC对象,因为参数类型不确定,所以可以传任何OC对象,所以id类型也就有了局限性。
局限性:调用一个不存在的方法,编译器会马上报错。
在使用id类型时出现的一个错误:
在Person的声明中用了@property int age;然后在主函数中创建对象调用他的set和get方法。直接调用都可以,但是用点语法的时候就出现了下面的错误。
本来以为是用了@property的关系,但是_age的声明和它对应的set和get方法我手动写出来后,还是这个错误。
原因:id类型是不可以使用点语法的,id类型是OC中独有的数据类型,在内部处理上,这个类型被定义为指向对象的指针,点语法是通过对象来调用set和get方法,id是指针,所以不可以调这两个方法。