OC中instancetype与id的区别

作者: 三木成森 | 来源:发表于2015-08-22 19:33 被阅读10053次

我们在查找API的时候,经常都会见到instancetype和id,他们区别并不大,都可以代表任何类型的对象.但是他俩还是有细微的差别的,接下来让我们一步步去揭开他俩的面纱.

我们首先创建一个工程,新建一个Person类和一个Student类,并且Student类继承自Person类.

Person类里面包含一个便利构造器+ (id)person; Student里面写一个简单的实例方法(-号方法)- (void )test;

另外在说instancetype与id的区别之前,首先需要补充一个知识:当父类的便利构造器想要被子类继承的话,在父类的便利构造器中要使用[self alloc]来创建对象,这样才能使子类调用父类的便利构造器.

我们在主函数main.m中用Person的便利构造器来创建Student对象,同时调用test方法.

person类方法的返回值为id时,直接报错

接下来,我们把环境改成MRC.

在MRC环境下,仅仅是警告,而且可以运行成功,并打印结果 上面的是peron类方法返回值为id的情况下出现的问题,接下来,我们看在环境ARC下,返回值为instancetype会是怎么样的结果? 在ARC环境下,返回值为instancetype,依然可以运行成功

同样的在MRC环境中,依然可以运行成功.通过简单的例子,我们可以看到instancetype和id的区别如下:

区别1:

在ARC(Auto Reference Count)环境下:

instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型.

在MRC(Manual Reference Count)环境下:

instancetype和id一样,不做具体类型检查

区别2:

id可以作为方法的参数,但instancetype不可以

instancetype只适用于初始化方法和便利构造器的返回值类型

相关文章

  • 知识汇总

    OC中instancetype与id的区别 区别1: 在ARC(Auto Reference Count)环境下:...

  • OC中instancetype与id的区别

    我们在查找API的时候,经常都会见到instancetype和id,他们区别并不大,都可以代表任何类型的对象.但是...

  • 万能指针 id 和 NSObject

    id 与 instancetype的区别

  • oc中instancetype和id的区别

    相同点:instanceType和id都是作为方法的返回类型而被使用。 不同点: 1.instancetype可以...

  • OC中instancetype和id的区别

    1. 相同点 都可以作为方法的返回类型,省去具体类型,提高代码的通用性。 2. 不同点 instancetype会...

  • id 与 instancetype 区别

    id 与 instancetype 区别 : 1.id 可以当返回值类型并且可以声明对象 2.instancety...

  • instancetype与id区别

    instancetype最重要的一点是有类型推断,编译器能正确的推断出返回实例的实际类型。 参考文章:为什么你需要...

  • id 与instancetype的区别

    instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型! 好处:确定对象类型帮编译器更好定...

  • instancetype与id的区别

    一、什么是instancetype instancetype是clang 3.5开始,clang提供的一个关键字,...

  • instancetype 与 id的区别

    instancetype是clang 3.5开始提供的一个关键字,与id一样表示某个方法返回的未知类型的Objec...

网友评论

  • WKCaesar:可能这个有点老了,我刚才照着你那么写没有问题
  • FengxinLi:怎么没看明白呢?难道ARC 返回的实例是instancetype
    三木成森:@Fengxinliju 首先需要补充一个知识:当父类的便利构造器想要被子类继承的话,在父类的便利构造器中要使用[self alloc]来创建对象,这样才能使子类调用父类的便利构造器.[[stu person] test]是说stu调用了父类的便利构造器,而person方法里的实现是[[self alloc]init];这样的话,相当于创建了一个Student的类对象,所以能调用test方法
    FengxinLi:@三木成森 test方法是在Student对象里面的. 但是person去调用怎么调用得到呢?还是你写了其他没贴出来?
    三木成森:@Fengxinliju 额,可能我没写清楚吧,instancetype只适用于便利构造器和初始化方法的返回值,所以我就写了Student类调用父类Person的便利构造器,同时返回值在ARC和MRC下都分别使用了id和instancetype来运行,比较不同环境下的情况.你可以自己简单的写下试试看 :blush:

本文标题:OC中instancetype与id的区别

本文链接:https://www.haomeiwen.com/subject/zlpoqttx.html