动态数据类型id

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)的子类

 

要注意的一点:

动态数据类型的可以访问私有方法以及只有实现没有声明的方法

 

posted @ 2016-01-12 21:33  爱上咖啡的唐  阅读(229)  评论(0编辑  收藏  举报