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 只能返回和方法所在类相同类型的对象 返回值类 ...
随机推荐
- <a>每次点击都会让浏览器重新打开一个窗口问题
<a> 标签的 target 属性规定在何处打开链接文档.如果在一个 <a> 标签内包含一个 target 属性,浏览器将会载入和显示用这个标签的 href 属性命名的.名称与 ...
- Myeclipse 找不到Convert to maven project选项
https://my.oschina.net/u/2419190/blog/504417 Window > Preferences > General > Capabilities ...
- 0512 Scrum 项目3.0
SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3. ...
- 学习PYTHON之路, DAY 2 - PYTHON 基础 2(基础数据类型)
一 字符串格式化输出 name = 'nikita' age = 18 print ("I'am %s, age is %d") % (name, age) PS: 字符串是 %s ...
- 读javascript高级程序设计03-函数表达式、闭包、私有变量
一.函数声明和函数表达式 定义函数有两种方式:函数声明和函数表达式.它们之间一个重要的区别是函数提升. 1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错: test(); functi ...
- Topcoder SRM583 DIV 2 250
#include <string> #include <iostream> using namespace std; class SwappingDigits { public ...
- bzoj 3124: [Sdoi2013]直径
#include<cstdio> #include<iostream> #define M 400009 #define ll long long using namespac ...
- redis入门指南-安装redis
纸上得来终觉浅 绝知此事要躬行 Redis官方不支持window.微软发布了可在redis的分支.不建议使用 但我确实用了. win7 redis2.8.4 php5.6 apache2.4 ht ...
- 变量声明提升 Vs. 函数声明提升
1. 变量声明提升 先看以下代码: 1)var in_window = "a" in window; console.log(in_window); 2)var in_window ...
- 由于@@ServerName等问题对SQL增量升级脚本进行补充
由于@@ServerName在安装数据库之后修改了机器名的情况下,获取到的内容仍然是原来的机器名,造成数据库连接失败, 所以不能直接使用该全局变量. 此外对升级脚本的执行方式做了一下调整,将版本的判断 ...