Swift中的内存管理
2019-06-30 本文已影响0人
盖小聂
1、内存管理,weak和unowned
2、@autoreleasepool
3、C 指针内存管理
1、内存管理,weak和unowned
- Swift中的unowned等效于OC中的unsafe_unretained,而Swift中的weak就是OC中的weak。如果能够确定在访问时不会已被释放,就尽量使用unowned;如果存在被释放的可能,那就选择用weak。
- 被标记为weak的变量一定需要是Optional值。
- 闭包和循环引用
lazy var printName: () —> () = {
[weak self] in
if let strongSelf = self {
print(“The name is \(strongSelf.name)”)
}
}
//self持有闭包,闭包又持有self,循环引用。
//为了解决这种闭包内的循环引用,我们需要在闭包开始的时候添加一个标注,
//来表示这个闭包内的某些要素应该以何种特定的方式来使用,比如像这里的[weak self]。
- 这种在闭包参数的位置进行标注的语法结构是将要标注的内容放在原来参数的前面,并使用括号括起来。如果有多个需要标注的元素的话,在同一个中括号内用逗号隔开。
{ [unowned self, weak someObject] (number: Int) —> Bool in
//…… return true
}
2、@autoreleasepool
- Swift中的自动释放池的创建语法:
autoreleasepool {
//dataWithContentsOfFile返回的autorelease对象。
//在Swift中更提倡的是用初始化方法而不是用像上面那样的类方法来生成对象,
//而且从Swift 1.1开始,因为加入了可以返回nil的初始化方法,
//像上面例子中那样的工厂方法都已经从API中删除了。
let data = NSData.dataWithContentsOfFile(path, options: nil, error: nil)
}
//使用初始化方法的话,我们就不需要面临自动释放的问题了,
//每次在超过作用域后,自动内存管理都将为我们处理好内存相关的事情。
let data = NSData(contentsOfFile: path)
3、C 指针内存管理
- 在Swift中C指针的内存需要自己手动管理。