2010-10-26 21 views
6

Busco a un ejemplo en línea que contiene este código en Objective-C¿Cuál es el equivalente Monotouch de dealloc?

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

    [activeController release]; 
    [super dealloc]; 
} 

Asumo el equivalente MT sería botar, estoy en lo correcto?

no tendrá que llamar a las:

[activeController release]; 
    [super dealloc]; 

métodos, ya que estarán recolección en MonoTouch, es esto también correcta?

Respuesta

14

MonoTouch es basura recolectada, por lo que no tiene que preocuparse por desasignar usted mismo.

Dicho esto, hay momentos en los que son conscientes de que usted está guardando algunos recursos grandes en la memoria y que desea ayudar al sistema mediante la disposición de los recursos de inmediato en lugar de esperar a que el recolector de basura en arrancar.

Esto es cuando llamar a Dispose es útil: libera los recursos asociados antes de que el recolector de basura lo haga. Esto es particularmente importante para objetos grandes, como imágenes, ya que las imágenes se almacenan en el montón no administrado, mientras que las referencias de objetos se almacenan en el montón administrado.

Lo que esto significa es que si tiene una imagen de 8 megabytes: 8 megabytes se almacenan en el montón no administrado (administrado por Objective-C) y 1 puntero (4 bytes) en el montón administrado. En cuanto al recolector de basura de Mono, estás usando 4 bytes, no 8 megas.

Así es en momentos en que puede ayudar al sistema llamando a dispose: sabe que la variable "myImage", que parece inocente, apunta a una gran cantidad de memoria.

+1

¡Cosas muy interesantes! Una pregunta para ti. ¿Qué significa "montón administrado"? ¿Podría explicar por qué las imágenes se insertan en un montón no gestionado? Gracias de antemano. –

1

Monotouch es basura recolectada. Antes de que un objeto sea basura recolectada, se llama al destructor del objeto.

Aquí está Microsoft's page about C# destructors. No sé si hay documentación más relevante para los destructores en Monotouch.

1

No necesita llamar a release o dealloc, están a cargo de MonoTouch.

0

De Xamarin Documentación

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

Debe llamar a botar cuando se necesita Mono en deshacerse de su objeto. Un posible caso de uso es cuando Mono no tiene conocimiento de que su objeto de NSO realmente contiene una referencia a un recurso importante como la memoria o un grupo de información. En esos casos, debe llamar a Dispose para liberar inmediatamente la referencia a la memoria, en lugar de esperar que Mono realice un ciclo de recolección de basura. Internamente, cuando Mono crea referencias NSString a partir de cadenas C#, las eliminará inmediatamente para reducir la cantidad de trabajo que el recolector de basura debe hacer. Cuantos menos objetos maneje, más rápido se ejecutará el GC. "

Cuestiones relacionadas