黑马程序员——OC语言基础---id类型及应用场景

                                                                             ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

id类型及应用场景

1、用NSObject访问子类对象方法

//需要强制转换,是静态类型

NSObject*obj = cat;

[(Cat*)objrun]; 

2、id类型

id是动态类型,程序只有在运行时才能确定它的具体类型。是指向哪个对象的。

id是一种通用的对象类型,它可以用来存储属于任何类的对象也可以理解为万能指针 

注意 在id的定义中,已经包好了*号。id指针只能指向os的对象。 

id类型的定义

Typedefstruct objcobject{

   Class isa;

} *id; 

局限性:调用一个不存在的方法,编译器会马上报错。

iOS5之后推出了instancetype类型

instancetype和id的异同

1)相同点都可以作为方法的返回类型

2)不同点

1,instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;

2,instancetype只能作为返回值,不能像id那样作为参数,

3、id类型应用场景

//动物类

Animal *animal = [Animal new]; //狗的类,狗继承自动物

Dog *dog = [Dog new]; //猫的类,猫继承自动物

Cat *cat = [Cat new]; //定义id类型

id obj = cat; //id obj = dog;

[objrun];

<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Animal : NSObject
-(void)run;
@end
@implementation Animal
-(void)run{    
    NSLog(@"动物会跑");    
}
@end
@interface Dog : Animal
-(void)eat;
@end
@implementation Dog
-(void)run{    
    NSLog(@"狗会跑");    
}
-(void)eat{    
    NSLog(@"狗在吃");   
}
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {       
        Animal *ani = [Animal new];
        [ani run];  //动物在跑
        //        [(Dog *)ani eat];(错误的)        
        Animal *an2 = [Dog new];
        [an2 run];  //狗在跑        
        //NSObject访问了子类特有的方法 run
        NSObject *obj = [Animal new];
        [(Animal*)obj run]; //动物再跑        
        //访问子类特有方法
        obj = [Dog new];
        [(Dog *)obj run];        
        //NSObjec是所有类的基类
        //obj可以指向任何子类        
        Dog *dog = [Dog new];        
        //注意id的使用
        //id类型的使用
        id obj2;
        obj2 = ani;
        [obj2 run];   //动物再跑        
        obj2 =dog;
        [obj2 run];   //狗在跑      
    }
    return 0;
}</span>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值