Swift iOS : 内存管理
生活随笔
收集整理的這篇文章主要介紹了
Swift iOS : 内存管理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Swift是自動(dòng)管理內(nèi)存的。這意味著,你不需要主動(dòng)釋放內(nèi)存。
比如Foo內(nèi)包含的Bar,可以隨同F(xiàn)oo一起被釋放:
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {var window : UIWindow?func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {Foo()return true} } class Foo {let bar: Barinit() {bar = Bar()}deinit {print("Foo exit")} } class Bar {deinit {print("Bar exit")} }復(fù)制代碼執(zhí)行此代碼,會(huì)打印:
Foo exit Bar exit復(fù)制代碼可見(jiàn)Foo和Bar都是自動(dòng)釋放的。作為程序員,你不需要做任何內(nèi)存的主動(dòng)釋放。
但是,有一種特殊情況,叫做雙向引用,導(dǎo)致釋放A時(shí),需要釋放B,而B(niǎo)又引用了A,那么兩個(gè)都無(wú)法被釋放:
class Foo {let bar: Barinit() {bar = Bar()bar.foo = self}deinit {print("Foo exit")} } class Bar {var foo: Foo? = nildeinit {print("Bar exit")} }復(fù)制代碼此代碼只會(huì)打印:
App exit復(fù)制代碼此時(shí),需要做的就是把這個(gè)雙向引用中的一個(gè)設(shè)置為weak,表示的意思是盡管我持有這個(gè)引用,但是釋放的時(shí)候,卻無(wú)需考慮此對(duì)象的釋放。
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {var window : UIWindow?func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {Baz()print("App exit")return true} } typealias Bar = (()->Void) class Foo {func work(_ bar : Bar) {bar()}deinit {print("Foo exit")} } class Baz {var a : String?init (){a = "1"let f = Foo()f.work(){[weak self]() inprint(self?.a)}} }復(fù)制代碼當(dāng)然,不標(biāo)記也是不行的,因?yàn)榫幾g器就不會(huì)通過(guò),它要求只要引用了self,就必須標(biāo)記。
總結(jié)
以上是生活随笔為你收集整理的Swift iOS : 内存管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: UOJ#31 【UR #2】猪猪侠再战括
- 下一篇: zabbix增加手机端4个url地址的返