id instancetype NSObject *的区别

 //=======   idinstancetype ================================

  • idinstancetype都可以做方法的返回值。

  • id类型的返回值在编译期不能判断对象的真实类型,即非关联返回类型,instancetype类型的返回值在编译期可以判断对象的真实类型,即关联返回类型。

  • id可以用来定义变量, 可以作为返回值, 可以作为形参,instancetype只能用于作为返回值。

 

 //=======   id 和 NSObject * ================================

  • id 并不一定是NSObject对象,并非所有对象都是继承于NSObject,比如NSProxy。同时,id与NSObject对象之间有很多的共同方法,比如retain/release等方法。说到底,任何对象的本质都是id类型。
  •  
  • 对于id类型,可以调用任意可见的selector,编译器不会进行检查。而对于NSObject *的对象来说,只能调用NSObject *对象所包含的selector。
  •  
  • 对于一些不想或不能进行类型检查的地方,可以使用id。在运行的时候通过respondToSelector:来进行检查。
  • 使用id来声明一个对象,相当于告诉编译器我们并不知道这个对象的类型,但是它实现了协议。

 

  • 使用id修饰的对象是动态类型,编译器在编译期不会去判断其真实类型,因此id指向的对象不管向其发送任何消息,编译器在编译期都不会有任何报错
     
  • 使用NSObject *修饰的对象是静态类型,在编译期就已经明确该对象是NSObject对象,因此当我们对该对象发送NSObject没有声明的方法时,编译器就会果断报错

https://www.jianshu.com/p/17c0cdde627c

https://www.cnblogs.com/CoderCLsun/p/5838223.html

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值