id(instancetype)解析、容错处理

instancetype解析:

在构造方法中会看到:

-(instancetype)init{
    /*self 是一个指针,表示当前调用该方法的对象本身*/
    /*super是一个关键字,用来调用父类方法*/
    self=[super init];   //最基本的初始化操作
    if(self){
       //要初始化的内容
    }
}
  • init无法确认是什么类继承了NSObject
  • instancetype前身是id,可以指向任意的对象类型;
  • id的弊端:虽然可表示所有类型,但是一个公共类型,处理不了精准的问题。
    instancetype更加智能,init写在哪个类中,就会自动用该类名来替代instancetype,instancetype只能用在构造方法里的返回类型。

id

  • 动态类型识别(在运行的时候进行,而不是在编译的时候进行)
    动态绑定,运行时确定类型之后才能确定消息是否能被响应
  • 补充:静态类型编译时查错,动态类型方便扩展。

一般用id后要进行容错处理:

容错处理:一般先判断对象类型,再判断能否响应某个方法,最后再执行。

  1. 确定对象类型
  • 判断对象是否是某个类的对象
    if( [value isNumberOfClass:[p1 Class] ] ) { }
  • 判断对象是否是某个类的对象或其子类对象
    if( [value isKindOfClass:[NSObject Class] ] ) { }

注意:NSString NSArray NSDictionary NSNumber
不能判断类的对象,因为它们底层是以“类簇”方式实现的,类方法都是私有子类提供的,本身只是对外暴露一个类。

  1. 判断能否响应方法
    Person *value = [Person new];
    [value length]; 判断能否响应方法
  • 在调用方法前,判断对象能不能响应方法
// SEL action = @selector ( length )
if(value respondsToSelector: @selctor(length)){   
    [value length];
}
else{
    NSLog(@“无法响应该方法”);
}
  • 判断一个类能不能响应某个方法:
if ( [ Person instancesRespondsToSelector:@selector(sayHello) ] ) {
    NSLog(@“Person 类实现了 sayHello方法”);
}
else{
    NSLog(@“Person 类没有实现 sayHello方法”);
}
  • 如果是判断私有方法:
    需要进行隐式调用:
    [ value performSelector: @selector(sayHello) ];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,802评论 18 399
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,228评论 6 13
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,827评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • http://stackoverflow.com/questions/31602251/set-the-calay...
    pockyzhang阅读 231评论 0 0