id是一种通用的对象类型,她可以用类存储属于任何类的对象,可以理解为万能指针
***在id的定义中,已经包装好了*号,id指针只能指向os的对象
NSObject 和id都可以指向任何对象
NSObject对象会惊醒编译时检查(需要强制类型转换)
id不需要强制类型转换,id可以直接使用
编译器看到id以后,认为是动态类型,不在检查类型
instancetype与id异同
相同点
都可以作为方法的返回类型
不同点
1)instancetype可以返回和方法所在类型相同的对象,id只能返回位置类型的对象
2)instancetype只能作为返回值,不能像id那样作为参数- 声明类
- #import <Foundation/Foundation.h>
- @interface Animal : NSObject
- -(void)run;
- @end
- 实现类
- #import "Animal.h"
- @implementation Animal
- -(void)run
- {
- NSLog(@"Animal在跑");
- }
- @end
复制代码- 继承Animal类,声明类
- #import "Animal.h"
- @interface Dog : Animal
- @end
- 实现类
- #import "Dog.h"
- @implementation Dog
- -(void)run
- {
- NSLog(@"Dog在跑");
- }
- @end
复制代码
用实践证明id与NSObject的区别
- #import <Foundation/Foundation.h>
- #import"Dog.h"
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- // insert code here...
- Animal *ani = [[Animal alloc]init];
- [ani run];//Animal在跑
- Animal *ani2 = [[Dog alloc]init];
- [ani2 run];//Dog 在跑
-
- NSObject *ob = [[Animal alloc]init];
- [(Animal*)ob run];//Animal在跑
-
- ob = [[Dog alloc]init];
- [(Dog*)ob run]; //Dog在跑
-
- //注意id使用
- //id类型的使用
- id obj2;
- obj2 = ani;
- [obj2 run]; //Animal在跑
- }
- return 0;
- }
复制代码 |
|