结构体
2022-02-17 本文已影响0人
aven_kang
[图片上传中...(截屏2022-02-17 上午11.56.11.png-bf3c74-1645070176879-0)]
[图片上传中...(截屏2022-02-17 上午11.59.43.png-d22d32-1645070390476-0)]
[图片上传中...(截屏2022-02-17 下午12.00.45.png-bf842f-1645070450289-0)]
[图片上传中...(截屏2022-02-17 下午12.05.58.png-5b67fd-1645070764001-0)] 截屏2022-02-17 下午12.06.16.png
struct Point {
var x = 10;
var y = 20;
var b = true
}
var p = Point(x:11,y:12,b:false)
p = Point(x:22)
这是struct跟类不同的地方,结构体可以自动初始化器,类是不行的,类在初始化的时候,是不会自动出现x,y,b这些自动补全属性如下图
截屏2022-02-17 下午12.12.12.png
截屏2022-02-17 下午12.13.40.png
结构体和类的本质
区别:OC在结构体内不允许定义方法,Swift是可以的
结构体事值类型(枚举也是值类型),类是引用类型(指针类型)
截屏2022-02-17 下午12.50.07.png
在上图中,结构体在类中初始化了,结构体存放在栈空间,两个Int类型的,共占用32个字节,而类的的初始化也是存放在栈空间,但是,只是存放了指针地址,也是八个字节,但是指针指向了堆空间,真正存放东西的地方。
如果在汇编中没发现alloc,malloc,基本都是存放在栈空间的
结构体存在在哪里,取决于它的位置在哪里,如果在函数里面,那就是在栈空间的,如果是全局的,那就是数据段里,全局的一个位置。如果结构体是类的一个成员,那么就是跟随类存放在对空间
对象的对空间申请过程
截屏2022-02-17 下午1.02.41.png值类型
截屏2022-02-17 下午1.22.07.png值类型的赋值操作
截屏2022-02-17 下午1.29.41.png1.在swift标准库中,为了提升性能,String,Array,Dictonary,set采用了Copy on write技术
2.比如仅当有写操作时,才会真正执行深度拷贝,如果是自定义的结构体,赋值的时候,是直接进行深度拷贝的
3.对于标准库值类型的赋值操作,Swift能确保最佳性能,所以没有必要为了保证最佳性能来避免赋值
4.建议:不需要修改的,尽量定义成let
引用类型
截屏2022-02-17 下午1.38.58.pngfunc testtt() {
class Szie {
var width: Int
var height: Int
init(width: Int,height:Int){
self.width = width;
self.height = height;
}
}
var s1 = Szie(width: 10, height: 11);
var s2 = s1;
s2.height = 30;
print(s1.height);
print(s1.height);
}
在上述代码中,s1赋值给了s2,然后s2改了成员变量,却发现s1的也跟着变了,其实在引用类型的赋值中,其实赋值的是指针,都是指向同一块内存地址,所以是相互影响的。