您的位置:首页 > 编程语言 > C语言/C++

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

2015-10-06 17:54 489 查看
                                                                             ------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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息