1.__kindof:表示当前类或它的子类。

  2.__kindof书写格式:放在类型前面,表示修饰这个类型。

  3.__kindof优点:在调用的时候,很清楚的知道返回类型。

  直接举一个例子来形容这个问题。假如我们声明了一个父类 Person ,这个父类有一个构造方法,如下:

 + (Person *)person {

     return [[self alloc] init];
}

  同时在这个父类 Person 的.h头文件中声明这个方法。这样我们在外界使用 Person 调用这个构造方法,返回的值肯定为 Person * 类型,毋庸置疑。

  我们再声明一个子类 SonOfPerson ,这样,我们在外界调用这个方法的时候,就会出现这样一个问题:

  通过上面的方法的实现,我们是知道这个方法返回的对象是 SonOfPerson 子类的类型的,但是编译器不知道,所以它提示我们一个 SonOfPerson 的指针类型指向了一个 Person 的对象。我们只能通过强制转换来让编译器不出现这样的警告。

  有什么办法能解决这个问题吗?

  1.使用 id 或 instancetype 类型。也就是这个样子:

 /*
+ (id )person { return [[self alloc] init];
}
*/ /*
+ (instancetype)person { return [[self alloc] init];
}
*/

  同时在.h中实现相应的方法。但问题随之出现:

  我们无法在编译器的提示中看到任何有关返回值的提示。它是个id类型,也就是说可能是任何对象。这样显然是不好的,若你在接口中写了个id对象,不用说你同事在看到这个接口时时如何懵逼,就是过两天你自己看可能都无法想起来这个接口究竟返回值是什么类型,造成不必要的麻烦。这样不好。

  同时比较下 id 和 instancetype 两种类型的异同:

    1.相同点

      都可以作为方法的返回类型。

    2.不同点

      2.1instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;

      2.2instancetype只能作为返回值,不能像id那样作为参数。

  2.使用__kindof:

 + (__kindof Person *)person {

     return [[self alloc] init];
}

  这样我们在使用的时候会这样提示:

  

  这样我们就清楚了,这个返回值类型是 Person 以及它的子类。同时,编译器也知道返回的可能是 Person 的子类,不会再给我们警告了。

iOS学习笔记(02) - 关键字 __kindof的更多相关文章

  1. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  2. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  3. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

  4. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  5. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  6. iOS学习笔记20-地图(二)MapKit框架

    一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...

  7. iOS学习笔记——AutoLayout的约束

    iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...

  8. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  9. IOS学习笔记25—HTTP操作之ASIHTTPRequest

    IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...

随机推荐

  1. [SQL基础教程] 3-1 对表进行聚合查询

    [SQL基础教程] 3-1 对表进行聚合查询 聚合函数 用于合计的函数称为聚合函数或者集合函数 COUNT SUM AVG MAX MIN SELECT COUNT(*) FROM table; SE ...

  2. 前端tab页实例

    <div class="tabbable"> <ul class="nav nav-tabs padding-16"> <c:fo ...

  3. 3.struts2访问Servlet API,并和mybaits实现全套增删改查

    1.创建数据库脚本userinfo.sql prompt PL/SQL Developer import file prompt Created on 2016年5月19日 by pc set fee ...

  4. php笔记(四)PHP类和对象之对象继承

    建立一个Truck类,扩展Car类,并覆盖speedUp方法,使速度累加50 <?php class Car { public $speed = 0; //汽车的起始速度是0 public fu ...

  5. E - Cup 2(dfs)

    E - Cup 2 Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Stat ...

  6. 查看Windows支持的内存大小

    cmd命令: wmic memphysical get maxcapacity

  7. use ContourPlot-使用ContourPlot

    use ContourPlot to draw implicit function graphics 使用ContourPlot 画隐函数图像 for example $x^{3}+y^{3}-3xy ...

  8. cuda8.0 /usr/bin/ld: cannot find -lGL

      /usr/bin/ld: cannot find -lGL collect2: ld returned 1 exit status tennycent@tennycent-desktop:~/$ ...

  9. 【转】spring管理属性配置文件properties——使用PropertiesFactoryBean|spring管理属性配置文件properties——使用PropertyPlaceholderConfigurer

     spring管理属性配置文件properties--使用PropertiesFactoryBean 对于属性配置,一般采用的是键值对的形式,如:key=value属性配置文件一般使用的是XXX.pr ...

  10. XSL相关

    <?xml version="1.0" encoding="utf-8" ?> <?xml-stylesheet type="tex ...