雖然在 Swift 中看起來"很像"是不需要煩惱內存管理的問題,不過實際上它還是遵循著自動引用計數 (ARC) 的規則,當一個物件沒有被其他對象引用時會自動被銷毀,如果三魂七魄沒有完全回位的話,就會有個靈體留在現世的空間裡,最經典的範例如下: 閉包(Closure)引用 classClassA { typealias Complete = ()->() var name : String var onComplete : Complete? init(_ name: String){ self.name = name print("Hello I am \(self.name)") onComplete = { print("\(self.name): onComplete!") // --> 閉包引用 self, 計數 + 1 } } deinit { print("deinit: \(self.name)") } } var a : ClassA? = ClassA("A") // --> 引用計數 + 1 a = nil // 2-1 = 1 還剩下 1 所以沒辦法銷毀 ---output------- Hello I am A 由於這邊的 onComplete 宣告為 Optional, 正確的做法要連同 onComplete 一起刪除才可以被回收,若不是 Optional 則會進入無法回收狀態: var b : ClassA? = ClassA("B") b?.onComplete = nil // --> 還好是 Optional 可以設成 nil 計數 - 1 b = nil // 計數 = 0 所以被回收 ---output------- Hello I am B deinit: B 但是做人不需要煩惱太多,這時候就出動 unowned 關鍵字讓物件可以順利被回收: onComplete = { [unowned self] in print
你太酷了
ReplyDeleteEdit profile
ReplyDeleteEdit profile
OpenID URL:
Edit profile
Name:
URL:
不好意思我有個問題想跟您請教
要在as3才有支援存圖片的功能
我已經有一個as2的swf因改寫成as3幅度太大
想在as3載入as2
但現在我的問題是
在as2內的圖案存在bmap1變數
要如何呼叫as3的function儲存bmap1的內容?
謝謝
直接改成 as3 的可能還比你用 as3 <-> as2 通信來的快....
ReplyDelete不然就請參考 SWFBridge: Easier AS3 to AS2 Communication by gskinner (請自行 google 一下)囉!
請問as3的MovieClip(MC3) Load as2,要怎麼讀取as2裡MovieClip(MC2)的動態文字(aa)的值?
ReplyDeletethis.MC3.MC2.aa.text?
stage.getChildByName("MC3").getChildByName("MC2").aa.text?
都出現錯誤..該怎麼寫呢?謝謝
同上次寫的,請先參考 SWFBridge: Easier AS3 to AS2 Communication by gskinner (請自行 google 一下)囉!
ReplyDeleteYour blog is very nice,Thanks for sharing.
ReplyDeleteหนังจีน