最近面试的时候,面试官问到了一个问题,“你知道'id'和(NSObject *)的区别吗”,有点懵,心里在想不应该是问'id'和‘ instancetype’的区别嘛。。。
反正没答上来,总结一下吧~
id
和instancetype
instancetype
clang 3.5
提供的关键字, 表示:某方法返回未知类型的OC对象
都知道id
任意类型关键字,为什么还会出现一个新的关键字?
返回关联类型
1、类方法中,alloc
, new
开头
2、实例方法中 autorelease
,init
,retain
,self
开头
会返回方法所在类的类型的对象,即关联返回类型的方法。
这些方法的返回结果以方法所在的类为类型。
for example
@interface NSObject
+(id)alloc;
-(id)init;
@end
当我们初始化NSArray
时
NSArray*array = [[NSArray alloc] init];
[NSArray alloc]
返回类型属于关联返回类型,NSArray *
instancetype
假如一个不是关联返回类型的方法
@interface NSArray
+(id)constructAnArray;
@end
当我们初始化的时候
[NSArray constructAnArray]
得到返回类型和方法声明的返回类型一样,是id
如果使用 instancetype
作为返回类型
@interface NSArray
+(instancetype)constructAnArray;
@end
同样方式初始化
[NSArray constructAnArray]
得到的返回类型和方法所在类型相同,是NSArray *
instancetype
的作用,就是使那些非关联返回类型的方法返回所在类的类型!
好处:确定对象类型帮编译器更好定位代码问题。
相同点:
作为方法的返回类型
不同点:
1、instancetype
可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象。
2、instancetype
只能作为返回值,id可以作为参数.
-(void)setValue:(instancetype)value {
}
报错!
应该写成
-(void)setValue:(id)value {
}
id NSProxy
众所周知,NSObject
类是Objective-C
中大部分类的基类。但不是很多人知道除了NSObject
之外的另一个基类——NSProxy Apple官方文档
NSProxy是和NSObject
同级的一个类,可以说它是一个虚拟类,它只是实现了<NSObject>
的协议,它的作用有点类似于一个复制类,有人曾经笑谈它是卡卡西的复制忍术,想想其实也挺贴切的,其实原理确实如此。OC确实是只能单继承的语言,但是基于运行时的机制,却有一种方法让它来实现一下"伪多继承",就是利用NSProxy这个类
回到之前的那个问题,答不上来只有问面试官,嘿嘿,面试官说由于NSProxy是和NSObject
同级,所以说(NSObject *)
还不能完全替代id
万能指针的作用,因为它还管不到NSProxy...额,好吧,