id 被成为万能指针,也就是可以指向任何对象.
NSObject * 本身就是定义指向NSObject类型的指针.
那么这两者有什么区别吗?
这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区别则在于id修饰的变量不遵循<NSObject>协议.这在实现代理模式中会体现出其区别,例如在调用代理方法时会先判断该代理是否能够响应某个方法 [obj respondsToSelector:]就定义在NSObject协议中.
那么,苹果后来为什么有使用instancType呢?
我觉得主要原因有两个,
第一,是命名问题:很多数据库的设计,均有id字段.(当然,现在依然不能使用);
第二,instancType只能作为方法返回值,不能修饰变量.而当作为方法返回值时,它与id的主要区别是什么呢?
举个简单例子:
NSString *str = [Person person]; NSLog(@"%lu", str.length);
对于以上代码,如果
[Person person]返回值为id类型,则在编辑代码时xcode不会报错或者警告,运行时则会崩溃(因为OC是动态检测对象的真实类型);
反之,当其返回值为instanceType时,xcode则会报出警告.
所以,建议写类的方法时,对于返回值,如果是id类型的话,尽量使用instanceType.