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 ...
随机推荐
- Abstract和Virtual
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别. 它们有一个共同点:二者都是用来修饰父类的,只能作为基类使用,通过覆盖父类的定义,让子类与overri ...
- python 之遍历目录树(可匹配输出特定后缀的文件)
涉及到的模块有os, fnmatch:1.通过os模块中的方法获取dir.subdir.files,通过os.path.join可拼接成完整路径: 2.fnmatch主要通过fnmatch.fnmat ...
- 【转】Jmeter(二)-使用代理录制脚本
Jmeter脚本是以JMX格式为主 Jmeter也是支持录制的,支持第三方录制方式和代理录制方式. 1.第三方录制主要是通过badboy来录制,录制后另存为jmx格式即可. 2.Jmeter也有自己的 ...
- 可用fidder测试的一些安全测试点
以下是整理的一些常见的安全渗透测试点 1.用工具fidder抓包拦截篡改服务器端返回的代码,导致下级拥有对上级的访问操作权限 以下是公司开发写的用户角色权限页面跳转 修改普通角色跳转的页面为管理员跳转 ...
- jsp中获取json字符串,并解析
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...
- oAuth 使得第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权
OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可 ...
- String中的==与Empty
1.String中的==与Equals方法执行结果一样吗? 我们都知道对于引用类型"=="比较的是引用而不是具体的值,但c#中有一种神奇的叫做操作符重载的东西.官方对String类 ...
- java 枚举类型和数据二进制等问题思考
.以下代码的输出结果是什么? int X=100; int Y=200; System.out.println("X+Y="+X+Y); System.out.println(X+ ...
- Transform 位置 旋转
using UnityEngine; using System.Collections; using Box2D.Dynamics; public class BodyGameObj : MonoBe ...
- lt>&eq
lt:less than,小于 gt:greater than,大于 eq:equal,等于 le:less equal,小于等于 ge:greater than,大于等于