id和NSObject *和instanceType的区别与联系

id 被成为万能指针,也就是可以指向任何对象.NSObject * 本身就是定义指向NSObject类型的指针.那么这两者有什么区别吗?这两者都是既可以作为返回值,又可以作为变量修饰.而其主要区别则在于id修饰的变量不遵循协议.这在实现代理模式中会体现出其区别,例如在调用代理方法时会先判断该代理是否能够响应某个方法  [obj respondsToSelector:]就定义在NSObject协议中.

那么,苹果后来为什么有使用instancType呢?

我觉得主要原因有两个,

第一,是命名问题:很多数据库的设计,均有id字段.(当然,现在依然不能使用);

第二,instancType只能作为方法返回值,不能修饰变量.而当作为方法返回值时,它与id的主要区别是什么呢?

举个简单例子:

NSString *str = [Person person];

NSLog(@"%lu", str.length);

对于以上代码,如果

[Person person]返回值为id类型,则在编辑代码时xcode不会报错或者警告,运行时则会崩溃(因为OC是动态检测对象的真实类型);

反之,当其返回值为instanceType时,xcode则会报出警告.

所以,建议写类的方法时,对于返回值,如果是id类型的话,尽量使用instanceType.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Co...
    __silhouette阅读 10,687评论 1 17
  • 科罗拉多大峡谷 等日出,凌晨五点四十五分。 世界观,就是站在世界不同角度,大峡谷无疑是一个特别的点。2100米的高...
    薇薇董阅读 4,108评论 0 0
  • 星期二的下午,傅老师带我们去福地玩儿了,我们玩的很开心。星期六妈妈带我去看热气球。我很兴奋,热气球那儿还可以野餐。...
    贤惠的煎蛋饼阅读 1,053评论 0 0
  • 今天抽了过去,现在,未来牌阵 现在是节制牌 读牌一:一个天使闭着眼睛一手拿着一只金灿灿的圣杯,在来回倒水。她的一只...
    宓儿_2b3e阅读 1,209评论 0 1