1、內(nèi)存管理,weak和unowned
2、@autoreleasepool
3、C 指針內(nèi)存管理
1、內(nèi)存管理,weak和unowned
- Swift中的unowned等效于OC中的unsafe_unretained,而Swift中的weak就是OC中的weak。如果能夠確定在訪問時(shí)不會已被釋放,就盡量使用unowned;如果存在被釋放的可能,那就選擇用weak。
- 被標(biāo)記為weak的變量一定需要是Optional值。
- 閉包和循環(huán)引用
lazy var printName: () —> () = {
[weak self] in
if let strongSelf = self {
print(“The name is \(strongSelf.name)”)
}
}
//self持有閉包,閉包又持有self,循環(huán)引用。
//為了解決這種閉包內(nèi)的循環(huán)引用,我們需要在閉包開始的時(shí)候添加一個(gè)標(biāo)注,
//來表示這個(gè)閉包內(nèi)的某些要素應(yīng)該以何種特定的方式來使用,比如像這里的[weak self]。
- 這種在閉包參數(shù)的位置進(jìn)行標(biāo)注的語法結(jié)構(gòu)是將要標(biāo)注的內(nèi)容放在原來參數(shù)的前面,并使用括號括起來。如果有多個(gè)需要標(biāo)注的元素的話,在同一個(gè)中括號內(nèi)用逗號隔開。
{ [unowned self, weak someObject] (number: Int) —> Bool in
//…… return true
}
2、@autoreleasepool
- Swift中的自動釋放池的創(chuàng)建語法:
autoreleasepool {
//dataWithContentsOfFile返回的autorelease對象。
//在Swift中更提倡的是用初始化方法而不是用像上面那樣的類方法來生成對象,
//而且從Swift 1.1開始,因?yàn)榧尤肓丝梢苑祷豱il的初始化方法,
//像上面例子中那樣的工廠方法都已經(jīng)從API中刪除了。
let data = NSData.dataWithContentsOfFile(path, options: nil, error: nil)
}
//使用初始化方法的話,我們就不需要面臨自動釋放的問題了,
//每次在超過作用域后,自動內(nèi)存管理都將為我們處理好內(nèi)存相關(guān)的事情。
let data = NSData(contentsOfFile: path)
3、C 指針內(nèi)存管理
- 在Swift中C指針的內(nèi)存需要自己手動管理。