3

閱讀MT文檔,我已經看到可以釋放內存也實現IDisposable .NET模式。MonoTouch和IDisposable模式

例如,在擴展的UIViewController(MyViewController)的自定義類,我可以覆蓋下面的方法:

public override void Dispose (bool disposing) 
{ 
    if (disposing){ 
    // do some stuff here 
    } 
    base.Dispose (disposing) 
} 

從這個角度出發,我的兩個問題是:

  1. 什麼類型除了圖像之外,還必須發佈哪些元素?
  2. 是否必須從MyViewController類的實例(myViewController.Dispose())調用Dispose方法,或者像dealloc方法一樣自動調用Dispose方法?

在此先感謝您。問候。

回答

3

IDisposable的第一個MonoTouch用法與Mono或.NET相同。你在其他地方閱讀過關於這個主題的文章,在stackoverflowMSDN ......都適用於此。

對於MonoTouch來說重要的是要記住NSObject實現了IDisposable,因爲它代表了本地對象,所以它很有意義。這意味着從NSObject繼承的所有內容,包括monotouch.dll的相當大部分,都實現了IDisposable

  1. 我有什麼類型的元素,除了圖像釋放?

大多數管理基於NSObject的對象實例雖小,但它們可以代表大本地對象(GC將只知道第一,管理,大小)。

所以最好是在你可以的時候處理基於NSObject的實例。當你使用它們作爲局部變量時。在C#中,使用using模式很容易。

OTOH使用你的判斷,小NSString不會花費太多的內存,而其他人可能是大的(或未知的,如NSString GetWebPageContent (NSUrl)

  • 我必須從MyViewController類的實例調用Dispose方法(myViewController.Dispose())或Dispose方法等dealloc方法自動調用?
  • Dispose圖案的部分確保終結者如果之前沒有被調用過,將會調用Dispose。因此,GC最終將回收與這些實例相關聯的內存(託管和非託管/本機)。

    您可能想要使用一些工具,如Gendarme(將在OSX上運行)或FxCop(僅限Windows),這些工具會向您報告(例如)某些類型的IDisposable字段未正確放置。

    免責聲明:我憲兵的維護者:-)

    +0

    謝謝您的答覆。很有幫助。我唯一不明白的是:「大多數託管的基於NSObject的對象實例很小,但它們可以代表大型的本地對象(GC只會知道第一個託管的大小)。」你能解釋一下它是什麼意思?再次感謝你。 –

    +0

    從_StackOverflow iDisposable標記info_清楚了託管和非託管對象之間的區別:非託管的對象不在.NET垃圾收集器的範圍之內。在MT中,我並不清楚兩者之間的差別,我很難應用正確的內存管理行爲。 –

    +1

    從管理的角度來看,類似'new NSString(「a」)'和'new NSString(「aaa ... 1000 ... aaa」)的東西,大小相同 - 即sizeof(NSString)大多隻是一個句柄,指向本地NSString對象的'IntPtr'。因此,GC不能使用* real *內存總量來決定何時收集。但是,一旦收集到第二個,將調用Dispose,並釋放長字符串。這就是在代碼中使用(或不)Dispose時的一些判斷,可以幫助您節省內存(通過確保它儘快發佈)。 – poupou