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那样作为参数
|