Swift iOS : 内存管理
生活随笔
收集整理的這篇文章主要介紹了
Swift iOS : 内存管理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Swift是自動管理內存的。這意味著,你不需要主動釋放內存。
比如Foo內包含的Bar,可以隨同Foo一起被釋放:
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")} }復制代碼執行此代碼,會打印:
Foo exit Bar exit復制代碼可見Foo和Bar都是自動釋放的。作為程序員,你不需要做任何內存的主動釋放。
但是,有一種特殊情況,叫做雙向引用,導致釋放A時,需要釋放B,而B又引用了A,那么兩個都無法被釋放:
class Foo {let bar: Barinit() {bar = Bar()bar.foo = self}deinit {print("Foo exit")} } class Bar {var foo: Foo? = nildeinit {print("Bar exit")} }復制代碼此代碼只會打印:
App exit復制代碼此時,需要做的就是把這個雙向引用中的一個設置為weak,表示的意思是盡管我持有這個引用,但是釋放的時候,卻無需考慮此對象的釋放。
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)}} }復制代碼當然,不標記也是不行的,因為編譯器就不會通過,它要求只要引用了self,就必須標記。
總結
以上是生活随笔為你收集整理的Swift iOS : 内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UOJ#31 【UR #2】猪猪侠再战括
- 下一篇: zabbix增加手机端4个url地址的返