3

Lecture de la documentation MT, j'ai vu qu'il est possible de libérer de la mémoire en implémentant également le modèle IDisposable .NET.Motif MonoTouch et IDisposable

Par exemple, dans une classe personnalisée qui étend UIViewController (MyViewController), je pourrais passer outre la méthode suivante:

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

A partir de ce point, mes deux questions sont:

  1. Quel type d'éléments dois-je libérer en plus des images?
  2. Dois-je appeler la méthode Dispose à partir d'une instance de la classe MyViewController (myViewController.Dispose()) ou la méthode Dispose est appelée automatiquement comme la méthode dealloc?

Merci d'avance. Cordialement.

Répondre

3

La première utilisation de MonoTouch de IDisposable est identique à Mono ou .NET. Ce que vous avez lu sur ce sujet ailleurs, sur stackoverflow ou sur MSDN ... s'appliqueront tous ici.

Ce qui est important est de MonoTouch WRT rappeler que NSObject implémente IDisposable qui fait beaucoup de sens car il représente un objet natif. Cela signifie que tout ce qui hérite de NSObject, une grande partie de monotouch.dll, implémente IDisposable.

  1. Quel type d'éléments dois-je libérer en plus des images?

La plupart gérés instances d'objets à base NSObject sont petites mais elles peuvent représenter un grand natifs objets (le GC ne sera au courant de la première, gérée, la taille).

Il est donc préférable d'éliminer les instances basées sur NSObject lorsque vous le pouvez, par ex. lorsque vous les utilisez en tant que variables locales. Le modèle using le rend facile à faire en C#.

OTOH utiliser votre jugement, un petit NSString ne prendra pas beaucoup de mémoire, tandis que d'autres pourraient être importants (ou inconnus, par exemple NSString GetWebPageContent (NSUrl).

  1. Dois-je appeler la méthode Dispose d'une instance de la classe MyViewController (myViewController.Dispose()) ou la méthode Dispose est appelée automatiquement comme méthode dealloc?

partie du motif Dispose assurer que le finalizer appellera Dispose s'il n'a pas été appelé précédemment. En tant que tel, le GC récupérera finalement la mémoire (à la fois gérée et non gérée/native) associée à ces instances.Vous voudrez peut-être utiliser des outils, tels que Gendarme (qui fonctionnera sur OSX) ou FxCop (Windows uniquement) qui vous rapporteront (par exemple) si certains de vos types ont des champs IDisposables qui ne sont pas éliminés correctement .

Responsabilité: Je suis le mainteneur :-) Gendarme

+0

Merci pour votre réponse. Très utile. La seule chose que je n'ai pas comprise est la suivante: "La plupart des instances d'objet basées sur NSObject sont petites mais elles peuvent représenter de grands objets natifs (le GC ne connaîtra que la première, la taille gérée)." Pourriez-vous expliquer ce que cela signifie? Merci encore. –

+0

De _StackOverflow iDisposable Tag info_ il est clair la différence entre les objets gérés et non gérés: les objets non gérés sont hors de portée du garbage collector .NET. En MT, je n'ai pas si clair la différence entre les deux et j'ai des difficultés à appliquer le bon comportement de gestion de la mémoire. –

+1

Des choses comme 'new NSString (" a ")' et 'new NSString (" aaa ... 1000 ... aaa ")' sont, d'un point de vue géré, de la même taille - ie sizeof (NSString) est principalement juste un handle, IntPtr qui pointe vers l'objet NSString natif. En tant que tel, le GC ne peut pas utiliser le total de la mémoire * real * pour décider quand collecter. Cependant, une fois la seconde collectée, 'Dispose' sera appelée, et la longue chaîne sera libérée. C'est là où un certain jugement lors de l'utilisation (ou non) de 'Dispose' dans votre code peut vous aider à conserver la mémoire (en veillant à ce qu'il soit publié dès que possible). – poupou