swift
一、值类型和引用类型
1:值类型(Value types)
每个实例都保留一份独有的数据拷贝,一般以结构体 (struct) 、 枚举(enum) 或者元组(tuple)的形式出现。如下OBAnimal
的结构体
typedef struct {
NSString *name;
}OBAnimal;
int main(int argc, char * argv[]) {
OBAnimal ani1;
ani1.name = @"ob";
NSLog(@"%p:%@",&ani1,ani1.name);
OBAnimal ani2 = ani1;
ani1.name = @"newOB";
NSLog(@"%p:%@",&ani1,ani1.name);
NSLog(@"%p:%@",&ani2,ani2.name);
return 0;
}
//打印如下
2020-08-13 14:55:12.980223+0800 ani1=0x7ffee7d2af08:ob
2020-08-13 14:55:12.980709+0800 ani1=0x7ffee7d2af08:newOB
2020-08-13 14:55:12.980785+0800 ani2=0x7ffee7d2af00:ob
当OBAnimal ani2 = ani1;
时,系统将会创建一个新的实例并将ani1
中的值拷贝一份,赋值给ani2
,所以修改ani1
中的name
,ani2
不会改变;ani2
和ani1
是两个内存的值
2:引用类型(Reference types)
每个实例共享一份数据来源,一般以类(class)的形式出现。
如果上面的
OBAnimal
是一个类,那么修改其中任意一个实例的name属性。那么另一个也会改变。
因为OBAnimal *ani2 = ani1;
操作时,堆上只有一个实例对象,ani2
和ani1
是两个指向这个实例对象的指针。
引用类型和值类型区别
- 类是引用类型, 结构体为值类型
- 结构体不可以继承
- 值类型被赋予给一个变量、常量或者被传递给一个函数的时候,其值会被拷贝
- 引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝
二、 mutating关键字
类是引用类型,而结构和枚举是值类型。
默认情况下,不能在其实例方法中修改值类型的属性。为了修改值类型的属性,必须在实例方法中使用mutating关键字。
使用此关键字,方法将能够更改属性的值,并在方法实现结束时将其写回到原始结构
所以要改成mutating
struct Person {
var name = "ob";
mutating func test(_ newName: String) {
self.name = newName;
print(self.name);
}
};
var tom = Person.init(); //这里就不能用let了,因为值改变了
tom.test("lsy");
//打印如下
lsy
三、strong、weak、 unowned
Swift 的内存管理机制与 Objective-C一样。
只有引用类型变量所引用的对象才需要使用引用计数器进行管理,对于枚举、结构体等,他们都是值类型的。因此不需要使用引用计数进行管理。
1:strong
strong 代表着强引用,是默认属性。不用写关键字strong
let cat = Animal.init();
2:weak
weak代表着弱引用。当对象被声明为 weak 时,该对象的引用计数不会增加1。它在对象释放后弱引用也随即消失。继续访问该对象,程序会得到 nil,不会崩溃
weak var cat = Animal.init();
因为对象释放时:需要对cat
指针进行cat = nil
操作,所以这里只能用var
可变类型
3:unowned
unowned 与弱引用本质上一样。唯一不同的是,对象在释放后,依然有一个无效的引用指向对象,它不是 Optional 也不指向 nil。如果继续访问该对象,程序就会崩溃。和oc的__unsafe_unreturned
一样
unowned var cat = Animal.init();
print(cat as Any); //发生崩溃
weak 和 unowned 的引入是为了解决由 strong 带来的循环引用问题。weak安全性高
上一篇: 关于视频号 张小龙是怎么想的?
推荐阅读
-
使用Swift代码实现iOS手势解锁、指纹解锁实例详解
-
《从零开始学Swift》学习笔记(Day 41)——类的继承
-
《从零开始学Swift》学习笔记(Day43)——构造函数继承
-
Swift实现iOS应用中短信验证码倒计时功能的实例分享
-
iOS生成二维码(中间包含图片),长按识别二维码(Swift)
-
宏碁swift3值得买吗?宏碁蜂鸟swift3银色版全面深度评测图解
-
swift修改UITextfield的Placeholder字体大小和颜色
-
《从零开始学Swift》学习笔记(Day 23)——尾随闭包
-
宏碁swift3值得买吗?宏碁蜂鸟swift3银色版全面深度评测图解
-
华硕推出ROG Swift PG27UQ G-Sync HDR显示器新品