2010-10-26 8 views
6

Je cherche un exemple en ligne qui contient ce code en c objectifQuel est l'équivalent Monotouch de dealloc?

-(void)dealloc { 
    [activeController viewWillDisappear:NO]; 
    [activeController.view removeFromSuperview]; 
    [activeController viewDidDisappear:NO]; 

    [activeController release]; 
    [super dealloc]; 
} 

Je suppose que l'équivalent MT serait Dispose, ai-je raison?

Je ne vais pas avoir besoin d'appeler les:

[activeController release]; 
    [super dealloc]; 

méthodes qu'ils seront recueillies sur MonoTouch Garbage, est-ce exact aussi?

Répondre

14

MonoTouch est ramassé à la poubelle, vous n'avez donc pas besoin de vous soucier de l'effectuer vous-même.

Cela étant dit, il y a des moments où vous savez que vous gardez certaines grandes ressources en mémoire et que vous voulez aider le système en disposant des ressources tout de suite au lieu d'attendre le garbage collector pour botter.

C'est lorsque l'appel de Dispose est pratique: il libère les ressources associées avant que le garbage collector ne le devienne. Cela est particulièrement important pour les objets volumineux, comme les images, car les images sont stockées sur le tas non géré, tandis que les références d'objet sont stockées dans le tas géré. Cela signifie que si vous avez une image de 8 mégaoctets: 8 mégaoctets sont stockés dans le tas non géré (géré par Objective-C) et 1 pointeur (4 octets) dans le tas géré. En ce qui concerne Garbage Collector de Mono, vous utilisez 4 octets, pas 8 megs.

Il est donc temps de faire appel au système en disposant de disposer: vous savez que la variable "myImage", d'apparence innocente, désigne une grande quantité de mémoire.

+1

Des choses très intéressantes !! Une question pour vous Qu'est-ce que" comme les images sont stockées sur le tas non géré, alors que les références d'objet sont stockées dans le Tas géré "moyen? Pourriez-vous expliquer pourquoi les images sont insérées dans un tas non géré? Merci d'avance. –

1

Monotouch est recueilli à la poubelle. Avant qu'un objet ne soit collecté, le destructeur de l'objet est appelé.

Voici Microsoft's page about C# destructors. Je ne sais pas s'il y a plus de documentation pertinente pour les destructeurs dans Monotouch.

1

Vous n'avez pas besoin d'appeler release ou dealloc, ils sont pris en charge par MonoTouch.

0

De Xamarin Documentation

http://docs.xamarin.com/ios/advanced_topics/api_design#When_to_call_Dispose

Vous devez appeler Dispose lorsque vous avez besoin Mono pour se débarrasser de votre objet. Un cas d'utilisation possible est lorsque Mono ne sait pas que votre objet NSObject contient réellement une référence à une ressource importante telle que la mémoire ou un pool d'informations. Dans ce cas, vous devez appeler Dispose pour libérer immédiatement la référence à la mémoire, au lieu d'attendre que Mono exécute un cycle de récupération de place. En interne, lorsque Mono crée des références NSString à partir de chaînes C#, il les dispose immédiatement pour réduire la quantité de travail que doit effectuer le garbage collector. Moins il y a d'objets à traiter, plus le GC fonctionnera rapidement. "