id 和 instancetype
静态数据类型
默认情况下所有的数据类型都是静态数据类型
静态数据类型的特点:
1 在编译时就知道变量的类型
2 知道变量中有哪些属性和方法
3 在编译的时候就可以访问这些属性和方法
4 并且如果是通过静态数据类型定义变量,如果访问了不属于静态数据类型的属性和方法,那么编译器就会报错
动态数据类型
id 是一个动态数据类型
动态数据类型的特点
1 在编译的时候编译器并不知道变量的真实类型,只有在运行的时候才知道它的真实类型
2 并且如果通过动态数据类型定义变量,如果访问了不属于动态类型的属性和方法, 编译器不会报错
id
1 id == NSObject *万能指针
2 id 和 NSObject * 的区别
NSObject * 是一个静态数据类型
id 是一个动态数据类型
3 调用方法
通过静态数据类型定义变量,不能调用子类特有的方法
通过动态数据类型定义变量,可以调用子类特有的方法
通过动态数据类型定义的变量,可以调用私有方法
4 弊端 :由于动态数据类型可以调用任意方法, 所以有可能调用到不属于自己的方法, 而编译时又不会报错, 所以可能导致 运行时 的错误
5 应用场景:多态,可以减少代码量,避免调用子类特有的方法需要强制转换
6 判断:为了避免动态数据类型引发的运行时的错误,一般情况下如果使用动态数据类型定义一个变量,在调用这个对象的方法之前会进行一次判断,判断当前对象是否可以调用这个方法(即判断是否为定义类或者其子类)
instancetype
1 init 方法的返回值是 instancetype,将返回值赋值给一个其他的对象会报警号
2 instancetype == id == 万能指针 == 指向一个对象
3 注意:以后但凡是自定义构造方法,返回值尽量使用 instancetype ,不要使用 id
id 和 instancetype 的区别
1 id在编译的时候不能判断对象的真实类型
2 instancetype 在编译的时候可以判断对象的真实类型
3 id 可以用来定义变量,可以作为返回值,可以作为形参
4 instancetype 只能用于作为返回值
5 对于 init 方法,id 和 instancetype 是没有区别的,因为编译器会把 id 优化成 instancetype。当明确返回的类型就是当前 Class 时,使用 instancetype 能避免 id 带来的编译不出的错误情况
id 和 instancetype的更多相关文章
- 简述id,instancetype和__kindof的区别
id: 好处:可以调用任何对象方法 坏处:不能进行编译检查 + (id)person; instancetype 好处:自动识别当前类的对象 坏处:不会提示返回的类型 + (instancetype) ...
- id和instancetype的异同
相同点: 都可以作为方法返回值类型 在initWithName:方法中是一样的,例如: - (id)initWithName:(NSString *)name; - (instancetype)ini ...
- iOS开发中id、NSObject *、id、instancetype四者有什么区别?
在使用Objective-C语言进行iOS应用开发的时候,常常会涉及到id.NSObject *.id.instancetype这四个概念的使用,但这四者也是iOS初学者最易混淆的内容,下面小编看 ...
- Id vs Instancetype
我写了一篇 Id vs Instancetype的文章,欢迎访问!
- id 和 instancetype 方法的区别
首先明确 id 和 instancetype 都是万能指针,都能指向一个对象:(instancetype == id == 万能指针 == 指向一个对象) 主要区别亮点: 1. id 在编译时候不能判 ...
- 六.OC基础--1. id和instancetype类型,2.动态类型检测,3.响应方法,构造方法,4.重写构造方法,5.自定义构造方法
1. id和instancetype类型, id和instancetype类型区别: 1. id和instancetype都可以用来作为方法的返回值 2. id可以用来定义类型,instancetyp ...
- 1.import和include区别 2.NSLog 和printf区别 3.创建对象做的事情 4. 类和对象方法比较 5 匿名对象优缺点 6. 封装 7.作用域范围 8.id和instancetype 9.自定义构造方法规范 10.nil和Nil及NULL、NSNull区别
1.import和include的区别: import可以防止头文件的重复包含 2.NSLog 和printf的区别: 1,NSLog可以自动换行, 输出调试信息, printf不能. 2,NSLog ...
- 【iOS开发-48】九宫格布局案例:自己主动布局、字典转模型运用、id和instancetype差别、xib反复视图运用及与nib关系
本次九宫格案例: (1)导入app.plist和各种图片素材,方便兴许开发.实际开发中,也是如此. (2)把plist中数组导入进来. --由于本案例中app.plist终于是一个数组,数组里面是字典 ...
- id NSObject instanceType 区别
id 当不确定数组元素类型时,可以选择使用id NSObject和id都可以指向任何对象 NSObject使用时必须强转 instantceType 只能返回和方法所在类相同类型的对象 返回值类 ...
随机推荐
- Key Figure、Exception Aggreagion、Non-Cumulative KeyFigure
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Hosts文件的使用
hosts文件是什么?在哪里?hosts文件:系统文件,可以记事本打开并编辑.一般用于域名到ip地址的解析.当用户在浏览器中输入网络的域名时,系统首先会自动从hosts文件中找到对应的ip地址,一旦找 ...
- ubuntu15.04 安装 pylab失败,先记下来,漫漫看
pydo@planpls:/var/python/web2py$ pip install pylab Downloading/unpacking pylab Downloading pylab-0.1 ...
- c语言期末复习题
代码参考:<K&R> 1.单词计数 #include<stdio.h> #define IN 1 #define OUT 0 main() { int c, state ...
- runtime运行机制方法学习
runtime这玩意第一次听说时都不知道是什么,经过了解后才知道它就是oc动态语言的机制,没有它那oc就不能称为动态语言.在之前可能大家对runtime了解都不深,随着编程技能的日益加深和需要,大家开 ...
- spring主要的作用?
在SSH框假中spring充当了管理容器的角色.我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句.Struts是用来 ...
- JQuery中的id选择器含有特殊字符时,不能选中dom元素
1.jquery类库在我们实际项目中用的很多,大家经常需要根据控件的id,获取对应的html元素.但是:当id含有特殊字符的时候,是不能选中的 2.jquery的id选择器只支持,单词.阿拉伯数字.下 ...
- 横向滑动的HorizontalListView滑动指定位置的解决方法
项目中用到了自定义横向滑动的控件:HorizontalListView,点击其中一项,跳转到另外一个大图界面,大图界面也是HorizontalListView,想使用setSelection方法设定 ...
- Java完成最简单的WebService创建及使用(REST方式,Jersey框架)
前言: 一直以来都对WebService感兴趣,但因为难以理解WebService到底是什么,所以了解甚少.周二的时候有个跟我关系比较好的同事想要自己写个WebService的小Demo,希望能够做成 ...
- shopex最新版前台一处想不到的SQL注入漏洞
shopex代码核心的地方都做了加密处理,找漏洞就需要一点想象空间了,比如这个SQL注入… 存在于用户注册(想不到的位置吧?) /core/shop/controller/ctl.passport ...