2010年4月28日 星期三

AS3裡出現不Single的Singleton


簡單的來說,就是有時候明明是使用Singleton.getInstance()但取得的instance就偏偏不是同一個。
一樣是一個開發上常會遇到的問題,今天我又遇到了,一下子以為是程式哪裡有bug,後來再看一下發現原來自己忘了會有這種情況發生,所以這次要記得寫下來放在blog上,免得以後自己又犯。

這問題會在這樣的結構下發生:
假設有一個載體A.swf,它會載入B.swfC.swf,然後有一個Singleton Class,就叫Singleton好了。
其中,B.swfC.swf都會使用Singleton.getInstance()來取得實體進行資料交換的動作,但是如果A.swf沒有先進行Singleton.getInstance()的話,B.swfC.swf所取得的實體會是不一樣的,這樣就一點都不single了。



解決方法一種就像剛剛講的,先在A.swf去取得Singleton的實體,但是這樣一來A.swf就永遠沒辦法跟B.swfC.swf進行鬆綁,是挺爛的一個解決方法。

另一個比較標準的解決方法就是在載入B.swfC.swf時順便把LoaderContextapplicationDomain設成ApplicationDomain.currentDomain就好了。

4 則留言:

  1. 我也都用第一個解決方法,但每次都要重新發布A.swf真的很麻煩。來試試第二種方法,3Q~~

    回覆刪除
  2. 請問在flex 使用module是否也會有一樣的情形?
    有時必須在Application 先getinstance()
    module才抓的到singleton.
    但這樣是否會發生module無法unload呢?
    謝謝~

    回覆刪除
  3. 理論上flex跟flash的run time是一樣的, 所以應該flex也會是一樣的情形.
    至於singleton有沒有辦法unload, 無論建立什麼類別, 記得自己在類別裡實作destroy, 用來將所有使用到的參照釋放掉, 這樣當你不想再使用這個singleton時, 就呼叫它的destroy function, 就可以確保資源會被gc處理掉. 如果一但singleton裡的資源都被處理掉, singleton本身有沒有被gc也不是這麼重要了. (我自己是習慣會在singleton裡寫一個static的destroy將instance也設成null)

    回覆刪除