iOS学习笔记(02) - 关键字 __kindof
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的更多相关文章
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)
机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习笔记20-地图(二)MapKit框架
一.地图开发介绍 从iOS6.0开始地图数据不再由谷歌驱动,而是改用自家地图,当然在国内它的数据是由高德地图提供的. 在iOS中进行地图开发主要有三种方式: 利用MapKit框架进行地图开发,利用这种 ...
- iOS学习笔记——AutoLayout的约束
iOS学习笔记——AutoLayout约束 之前在开发iOS app时一直以为苹果的布局是绝对布局,在IB中拖拉控件运行或者直接使用代码去调整控件都会发上一些不尽人意的结果,后来发现iOS在引入了Au ...
- 软件测试之loadrunner学习笔记-02集合点
loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...
- IOS学习笔记25—HTTP操作之ASIHTTPRequest
IOS学习笔记25—HTTP操作之ASIHTTPRequest 分类: iOS2012-08-12 10:04 7734人阅读 评论(3) 收藏 举报 iosios5网络wrapper框架新浪微博 A ...
随机推荐
- node + express 资料
https://www.youtube.com/watch?v=65a5QQ3ZR2g&list=PL55RiY5tL51oGJorjEgl6NVeDbx_fO5jR https://www. ...
- NodeJs md5 sha1加密
var crypto = require('crypto');module.exports = { md5: (str)=> { return crypto.createHash('md ...
- Python数据预处理—训练集和测试集数据划分
使用sklearn中的函数可以很方便的将数据划分为trainset 和 testset 该函数为sklearn.cross_validation.train_test_split,用法如下: > ...
- .NET 简单的扩展方法使用。
写代码时,我们经常会碰到dll中提供的方法,不够用或者不好用的情况.而且我们也不方便去更改dll本身的源码. 这时候我们可以使用.NET提供的"扩展方法"去解决这个问题. 下面我写 ...
- C#多线程:深入了解线程同步lock,Monitor,Mutex,同步事件和等待句柄(中)
本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法..NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢?其实, ...
- 描述符和property内建函数
首先我们搞清楚__getattr__ ,__get__ 和 __getattribute__ 作用的不同点. __getattr__在授权中会用到. __getattribute__ 当要访问属性时 ...
- HP Autonomy KeyView入门使用&Maven打包流程
正文:使用自带的KeyView.jar可能报各种各样的错误,比如no manifest,找不到main方法等等,这里需要自己把需要用到的Filter类和KeyView.jar一起打包,并修改manif ...
- angular2与VS2015 asp.net core集成使用
首先,需要在VS2015环境下更新到update2,并安装asp.net core环境,并安装Node.js插件. 新建asp.net core项目: 此时,需要先新建npm配置文件,如图: 并定义n ...
- mybatis 主键UUID生成策略
<insert id="insert" parameterType="com.lsfwpt.lawmis.po.SysUser"> <sele ...
- 获取星座的JS函数
通过JS获取星座的函数 function getConstellation(m,d){ var s="魔羯水瓶双鱼牡羊金牛双子巨蟹狮子处女天秤天蝎射手魔羯"; var arr=[2 ...