黑马程序员技术交流社区
标题: OC学习笔记之id类型及应用场景 [打印本页]
作者: chunhuayun 时间: 2015-10-5 15:20
标题: OC学习笔记之id类型及应用场景
1、NSObject访问子类方法
NSObject是所有类的基类,可以指向任何子类
例如:
- #import <Foundation/Foundation.h>
- #pragma mark Animal类声明部分
- @interface Animal: NSObject
- -(void)eat;
- @end
- #pragma mark Animal类实现部分
- @implementation Animal
- -(void)eat{
- NSLog(@"Animal eat...");
- }
- @end
- #pragma mark Dog类声明部分
- @interface Dog: Animal
- -(void)eat;
- @end
- #pragma mark Dog类实现部分
- @implementation Dog
- -(void)eat{
- NSLog(@"Dog eat...");
- }
- @end
-
- int main(int argc, const char * argv[])
- {
-
- @autoreleasepool {
- NSObject *obj = [Animal new];
- NSObject *obj2 = [Dog new];
-
- Animal *ani =[Dog new];
- [ani eat];
- //访问子类特有的方法
- [(Animal*)obj eat];
- [(Dog*)obj2 eat];
-
- }
- return 0;
- }
复制代码
打印结果:
2015-10-05 10:36:57.614 Demo01[1278:303] Dog eat...
2015-10-05 10:36:57.616 Demo01[1278:303] Animal eat...
2015-10-05 10:36:57.617 Demo01[1278:303] Dog eat...
2、id是一种通用的对象类型,它可以用于存储属于任何类的对象
它也可以理解为【万能指针】
【注意】id在定义的时候已经包含了“*”,id指针只能访问os的对象
id类型的定义:
typedef struct objc object{
Class *isa;
}id;
例如:
- //id类型使用
- id dog = obj2;
- id animal = obj;
- //id类型使用时不会有类型检查,编译器在遇到id后就认为它是动态类型,就不会检查它的类型
- [dog eat];//狗在跑
- [animal eat];//动物在吃
复制代码
打印结果:
2015-10-05 10:43:32.727 Demo01[1338:303] Dog eat...
2015-10-05 10:43:32.727 Demo01[1338:303] Animal eat...
3、id和instancetype的异同
ios5之后推出了instancetype类型
1)相同点
都可以作为方法的返回类型
2)不同点
A、instancetype可以返回方法所在类相同类型的对象,id只能返回未知类型的对象。
B、instancetype只能作为返回值,不能像id那样作为参数
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |