OC 动态数据类型ID

静态数据类型
特点:

1.在编译时就知道变量的类型
2.知道变量中有哪些属性和方法
3.在编译的时候就可以访问这些属性和方法
4.通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错

动态数据类型

1.在编译的时候编译器不知道数据的真实类型,只有在运行的时候才知道数据的真实类型
2.如果通过动态数据类型定义的变量,如果访问了不属于动态数据类型的属性和方法,编译器不会报错

id是一个动态数据类型
作用:
- 定义变量
- 作为函数的参数
- 作为函数的返回值

1.通过静态数据类型定义变量,不能调用子类特有的方法
2.通过动态数据类型定义变量,可以调用子类特有的方法
3.通过静态数据类型定义变量,可以调用子类的私有方法


//Person是Student的父类
//Person有eat的方法,Student有study的方法
Person *p = [Person new];
[p eat];    //
[p study];  //报错
Student * s = [Student new];
[s eat];    //报错
[s study];  //
Person *per = [Student new];//多态
//per实际上分配的是Student类的空间,但是不能调用Student的方法
[per eat];      //
[per study];    //报错

id obj = [Person new];
[obj eat];      //
[obj study];    //
id obj1 = [Student new];
[obj1 eat];     //
obj1 study];   //

弊端:由于动态数据类型可以调用任一方法,所以有可能调用到不属于自己的方法,又不会报错,会导致运行时的错误

应用场景:多态,可以减少代码量,避免调用到子类特有的方法需要强制类型转换

为了避免动态数据类型引发的运行时的错误,一般情况下如果使用动态数据类型定义一个变量,
在调用这个变量的方法之前会进行以此判断,判断当前变量是否能够调用这个方法.

if([obj isKindOfClass:[Student class]])
{
    //isKindOfClass,判断指定对象是否是一个类,或者是某一个类的子类
    [obj studyt];
}
if([obj isMemberOfClass:[Student class]])
{   
    //判断是否为子类
    [obj student];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值