动态数据类型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)的子类

 

要注意的一点:

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

 

转载于:https://www.cnblogs.com/JavaTWW/p/5125687.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值