黑马程序员技术交流社区

标题: OC学习笔记之id类型及应用场景 [打印本页]

作者: chunhuayun    时间: 2015-10-5 15:20
标题: OC学习笔记之id类型及应用场景
1、NSObject访问子类方法
NSObject是所有类的基类,可以指向任何子类
例如:
  1. #import <Foundation/Foundation.h>
  2. #pragma mark Animal类声明部分
  3. @interface Animal: NSObject
  4. -(void)eat;
  5. @end
  6. #pragma mark Animal类实现部分
  7. @implementation Animal
  8. -(void)eat{
  9.     NSLog(@"Animal eat...");
  10. }
  11. @end
  12. #pragma mark Dog类声明部分
  13. @interface Dog: Animal
  14. -(void)eat;
  15. @end
  16. #pragma mark Dog类实现部分
  17. @implementation Dog
  18. -(void)eat{
  19.     NSLog(@"Dog eat...");
  20. }
  21. @end

  22. int main(int argc, const char * argv[])
  23. {

  24.     @autoreleasepool {
  25.         NSObject *obj = [Animal new];
  26.         NSObject *obj2 = [Dog new];
  27.         
  28.         Animal *ani =[Dog new];
  29.         [ani eat];
  30.         //访问子类特有的方法
  31.         [(Animal*)obj eat];
  32.         [(Dog*)obj2 eat];
  33.         
  34.     }
  35.     return 0;
  36. }
复制代码


打印结果:
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;


例如:
      
  1. //id类型使用
  2.         id dog = obj2;
  3.         id animal = obj;
  4.         //id类型使用时不会有类型检查,编译器在遇到id后就认为它是动态类型,就不会检查它的类型
  5.         [dog eat];//狗在跑
  6.         [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