Swift 类和结构体的定义方式是比较相似的,从下面代码可以直观的看在Swift的类和结构体格式上的区别。
//类定义
class LGPerson {
var name: String;
var age: Int;
init(_ age: Int, _ name: String) {
self.age = age;
self.name = name;
}
deinit{}
}
// 结构体定义
struct LGPerson {
var name: String;
var age: Int;
init(_ age: Int, _ name: String) {
self.age = age;
self.name = name;
}
}
类与结构体的相同点与不同点
相同点
- 定义存储值的属性
- 定义方法
- 定义下标以使用下标语法提供对其值的访问
- 定义初始化器
- 使用 extension 来拓展功能
- 遵循协议来提供某种功能
不同点
- 类有继承的特性,而结构体没有
- 类型转换使您能够在运行时检查和解释类实例的类型
- 类有析构函数用来释放其分配的资源
- 引用计数允许对一个类实例有多个引用
在内存上:
类是引用类型,是一个类类型的变量存储的是当前实例内存地址的引用;
结构体是一个典型的值类型,是存储的具体的实例,可以理解成具体的值。
类与结构体最本质的区别
类是引用类型、结构体是值类型
1、通过修改属性字段的结果来看,我们可以把引用类型可以理解成一个在线共享的Excel,其他人对其修改,都是针对的同一个Excel进行修改(同一个源文件);而值类型就相当于本地的Excel,其他人对其修改,都是从本地Excel拷贝出一份,这样别人修改了什么,本地的不会感知的(不同的源文件)。
2、存储位置不同:值类型存储在栈上,引用类型存储在堆上。
了解这些之后,我们可以分析出开发过程中一些不需要继承特性的、不需要再运行时检查和解释实例的,都尽量使用Struct(结构体),因为计算机的读写存储速度在栈上是大于堆上的读写速度,这样就可以针对开发过程中的性能优化有了一个解决的方向。
x/8g : 可以读取内存中的值(8g表示8字节格式的输出)
栈区Stack、堆区Heap、全局区Global
- 栈主要存放局部变量、方法参数,由系统分配,快速高效
- 堆区主要存放对象(内存地址)
- 全局区存储全局变量、常量、代码区
了解这些之后,我们怎么去得知我们想要的对象是存放在在栈区还是堆区呢?这时候我们就可以使用一些llbd的命令去查看。
po withUnsafePointer(to: &对象实例){print($0)}