id相当于NSObject *
但是略有不同,NSObject *是静态数据类型
如Student继承Person继承NSObject,Person有age方法,Student有score方法
Person *p=[Student new];
[p score];会编译出错,不能直接访问子类方法
Student *s=(Student *)p;
[s score];强转之后可以调用
id obj1=[Person new];
[obj1 age];
id obj2=[Student new];
[obj2 score];
上面调用时都可以执行的,相比省略了强转这个步骤
但是[obj1 score];虽然编译时不会报错,但是运行时会报错,因为Person没有score方法
所以在使用id时最好在一些判断
if([obj1 isKindOfClass:[Student class]]){....};判断某对象(obj1)是否是某个类(Student),或者其子类
if([obj1 isMemberOfClass:[Student class]]){....};判断某对象(obj1)是否是某个类(Student)的实例对象
if([Student isMemberOfClass:[Person class]]){....};判断某个类(Student)是不是另一个类(Person)的子类
要注意的一点:
动态数据类型的可以访问私有方法以及只有实现没有声明的方法
时间: 2024-10-11 23:12:45