Swfit 属性与汇编分析inout本质
今天将讲述Swift属性以及剖析inout的本质, 如有兴趣可点击关注,以后会定期更新更有料的博客!!!
一、属性
Swift中跟实例相关的属性可以分为2大类
- 存储属性(Stored property)
- 类似于成员变量这个概念
- 存储在实例的内存中
- 结构体、类可以定义存储属性
- 枚举不可以定义存储属性
2. 计算属性(Computed Property)
- 本质就是方法(函数)
- 不占用实例的内存
- 枚举、结构体、类都可以定义计算属性
struct Circle {
//存储属性
var radius: Double
//计算属性
var diameter: Double {
set{
radius = newValue /
}
get{
radius *
}
}
}
1. 存储属性
将针对例子讲解上面的结论
将结构体Struct改为类Class,如下
解释下为什么枚举Enum不可以定义存储属性?
2. 计算属性
上面说到计算属性相当于函数方法的意思如下,前后两者完全等价
总结
存储属性: 关于存储属性,Swift有个明确的规定
- 创建类或者结构体时, 必须为所有的存储属性设置一个合适的初始值
- 可以在初始化器内为存储属性设置一个初始值,也可以分配一个默认的属性值作为属性定义的一部分
计算属性: set传入的新值默认为newValue,也可以自定义
- 只读计算属性: 只有get,没有set
- 可读可写属性
- 没有只写属性,单独一个set方法是不可以的
枚举的原始值rawValue的本质是只读计算属性
3. 延迟存储属性(Lazy Stored Property)
使用lazy可以定义一个延迟存储属性, 在第一次用到属性的时候才会进行初始化
4. 属性观察器(Property Observer)
可以为非lazy的var存储属性设置属性观察器,也是存储属性
注意: 在初始化器中设置属性值不会触发willSet和didSet方法!!!
二、inout本质
inout:输入输出参数的本质就是引用传递(地址传递)
通过inout查看汇编代码:leap命令: 将地址传入进去
inout本质总结:
如果实参有物理内存地址且没有设置属性观察器:直接将实参的内存地址传入函数(实参进行引用传递)
如果实参是计算属性 或者 设置了属性观测器:采取了苹果官方说的 Copy In Copy Out的做法
- 调用该函数时,先复制实参的值,产生局部变量副本(相当于get)
- 将副本的内存地址传入函数(副本进行引用传递),在函数内部可以修改副本的值
- 函数返回后,再将副本的值覆盖实参的值
Swfit 属性与汇编分析inout本质的更多相关文章
- Swift系列七 - 汇编分析值类型
通过汇编分下值类型的本质. 一.值类型 值类型赋值给var,let或者给参数传参,是直接将所有内容拷贝一份.类似于对文件进行复制粘贴操作,产生了全新的文件副本,属于深拷贝(deep copy). 示例 ...
- GDB调试汇编分析
GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdb ...
- 20145233 GDB调试汇编分析
GDB调试汇编分析 代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const static long ad ...
- Keil开发的ARM程序main函数之前的汇编分析
Keil开发的ARM程序main函数之前的汇编分析 ——BIN文件中RW段的数据移动 系统平台: STM32系列STM32F103ZE,512KB内部FLASH,64KB片内存储; FLASH地址范围 ...
- 高级C代码的汇编分析
在windows上,常用的函数调用方式有: Pascal方式,WINAPI(_stdcall)方式 和C方式(_cdecl) _cdecl调用规则: 1,参数从右到左入堆栈 2,在函数返回后,调用者要 ...
- VC++代码的汇编分析(一)
VC++代码是最接近汇编指令的高级语言,为了更加准确和深刻理解VC++编码中所涉及的很多技术概念和编译器参数的含义,从汇编指令层面进行剖析和解读,有助于开发者更加准确.直观.深刻理解高级语言中很多概念 ...
- STM32F10x的启动汇编分析
;******************** (C) COPYRIGHT 2009 STMicroelectronics ********************;* File Name ...
- SDL获得屏幕属性及实现分析
[时间:2017-05] [状态:Open] [关键词:sdl2,屏幕分辨率,显示区域,多媒体渲染,窗口,sdl2源码分析] 0 引言 本文的主要目标在于使用SDL2获得屏幕相关的属性,比如分辨率.屏 ...
- AbstractBeanDefinition:lenientConstructorResolution属性源码分析
版本:spring-framework-4.1 一概述 在看AbstractBeanDefinition源码时,注意到lenientConstructorResolution属性有诸多不疑,现在通过示 ...
随机推荐
- shiro遇到的坑-重写sessionManager遇到的坑
最近公司开发一个微信小程序项目加shiro的项目.因为微信小程序是不使用cookie,使用的是 storage .那么我们就不能使用传统的方式来保持登录状态了. 1.首先和网上的一样,先重写一个Ses ...
- XRichText
XRichText是一个可以显示Html富文本的TextView.可以用于显示新闻.商品详情等场景.欢迎star.fork,提出意见. 使用 Gradle : compile 'cn.droidlov ...
- C#结构体的使用
C#结构体的使用 结构体:相当于是我们自己定义的一种复杂的类型. 常见简单类型:int... double float bool char string 常见复杂类型:DateTime 数组类型 生活 ...
- SQLserver安装了多个实例,实例端口号也被修改后的代码连接方式
事例说明 IP地址为192.168.1.100的服务器上安装了SQLServer2000,它有两个实例,分别为:默认实例——JLW和另外新建的实例——JLW\TEST SQLServer网络实用工具中 ...
- deeplearning.ai 序列模型 Week 2 NLP & Word Embeddings
1. Word representation One-hot representation的缺点:把每个单词独立对待,导致对相关词的泛化能力不强.比如训练出“I want a glass of ora ...
- linux下文件夹归置方式
/bin:二进制可执行命令./dev:设备特殊文件./etc:系统管理和配置文件./etc/rc.d:启动的配 置文件和脚本./home:用户主目录的基点,比如用户user的主目录就是/home/us ...
- 吴裕雄--天生自然python学习笔记:WEB数据抓取与分析
Web 数据抓取技术具有非常巨大的应用需求及价值, 用 Python 在网页上收集数据,不仅抓取数据的操作简单, 而且其数据分析功能也十分强大. 通过 Python 的时lib 组件中的 urlpar ...
- Qt 多线程QThread实现方法之一
基本思想 在主线程中,哪里需用多线程,就在哪里创建一个QThread实例: 把耗时操作封装到一个继承于QObject的子类(这里叫做工作类Worker)槽函数中: 创建QThread实例和Worker ...
- MyBatis 逆向工程介绍
1. 概念: 逆向工程就是根据数据库中对应的表在项目工程中生成相应的MyBatis代码(XXXMapper.java/XXXMapper.xml/Moudle(XXX)),逆向工程生成的代码可以进行简 ...
- 思科WLC5508上传定制Portal展示模版
1. 登录Cisco设备,获取模板样例登录cisco WLC设备后点击help,打开帮助文档Wireless Tab-->Web Login Page-->External Web Aut ...