------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>