日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift iOS : 内存管理

發布時間:2025/3/8 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 : 内存管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。