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 ...
随机推荐
- Pelican主题配置:elegant
简介 elegant是Mac风格的优秀主题,简单,专注文章本身. A responsive, minimal, and stylish theme for Pelican:https://github ...
- C#第十一天(winform)
1.MD5 namespace MD5加密与解密 { class Program { static void Main(string[] args) { "); Console.WriteL ...
- group by 和count 联合使用问题
工作中要根据用户发布的产品数量来排序做分页,使用group by uid 用count(uid) 来统计的数量和想要的数量不正确. count统计的数量是被group by 分组以后每一组中数据的数量 ...
- Webdriver其他定位方式
1.下拉框的定位 在遇到select下拉框的选择时,比如: <select id="nr" name="NR"> <option select ...
- pro asp.net mvc5 7
一个类可以依靠IProductRepository这一接口获取Product对象,而不必知道这些对象从哪里来,也不必知道该接口的实现类如何递交这些对象,这就是存储库模式的本质
- NSXMLParser自定义的一个xml解析工具
// // DenglXMLParser.h // #import <Foundation/Foundation.h> @interface DenglXMLParser : NSXMLP ...
- IE8下 Select文字垂直居中的办法
.select { padding: 4px 0; height: 30px; line-height: 26px; vertical-align: middle;} 处理前: 处理后:
- ES6(一)let const
1.let 声明变量 let和var区别: let 只在变量声明时所在的代码块内有效 let不允许在同一作用域内重复声明变量 let不存在变量提升 const: 也是声明一个只读常量,一旦声明,常量的 ...
- 5. test命令
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 1. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大 ...
- adb shell dumpsys
adb shell dumpsys activity activities -- class/packagename adb shell dumpsys batterystate --reset ...