Pregunta

En mi código, utilice un objeto Singleton como punto central en mi aplicación para cargar imágenes y la memoria caché de la aplicación necesita con frecuencia, por lo que no tengo que hacer la asignación de memoria que consume muchos recursos cada vez que se carga una imagen.

Sin embargo, hay veces durante la ejecución de mi aplicación en el uso de memoria vuelve intenso y me gustaría para liberar los datos de imagen almacenados en caché. Actualmente, sólo estoy liberando las instancias de mi UIImage aislado cuando recibo una advertencia de memoria.

Yo preferiría, sin embargo, ser capaz de liberar todo el objeto singleton. ¿Es eso posible? Si es así, ¿cómo?

¿Fue útil?

Solución

Por supuesto que es. A pesar de que es bastante probable que el uso de la memoria de este objeto es insignificante en comparación con las imágenes.

Por la naturaleza de un producto único, es necesario tener un descriptor de acceso para ello, donde se crearlo si no existe actualmente:

+ (MySingletonClass*) mySingleton
{
    if ( mySingleton == nil )
    {
        mySingleton = [[MySingletonClass alloc] init];
    }

    return mySingleton;
}

Sólo tiene que añadir otra que se llama cuando se quiere destruirlo:

+ (void) destroyMySingleton
{
    [mySingleton release];
    mySingleton = nil;
}

Si se mantiene referencias a ella en todo otro lugar que tendrá problemas; no hagas eso. Si se accede desde múltiples hilos que deberá realizar la sincronización. De lo contrario, es bastante sencillo -. Getter volverá a crear cuando la necesidad siguiente

Otros consejos

Este es un ejemplo de un descriptor de acceso para el código de producto único OpenAL que estoy usando.

  // Eric Wing. Singleton accessor.  This is how you should ALWAYS get
  // a reference to the sound controller.  Never init your own.
  + (OpenALSoundController*) sharedController
 {
  static OpenALSoundController* shared_sound_controller;
  @synchronized(self)
  {
   if (nil == shared_sound_controller)
    {
     shared_sound_controller = [[OpenALSoundController alloc] init];
    }
  }      
  return shared_sound_controller;
 }

OpenAL toma un tiempo para cargar por lo que mantener una instancia alrededor es exactamente lo que necesito. Con más de un hilo en el juego (no es mi situación actualmente, pero yo quiero que mi código para ser portado a situaciones en las que este es el caso) puse un bloqueo en self. @synchronized(self) hace exactamente eso.

Ahora me asignaron la memoria, así que estoy responsable de soltarlo. Podría llamar [shared_sound_controller autorelease] en el método de acceso +sharedController pero esto puede liberar el controlador temprana, particularmente cuando tenga más de un hilo y yo llamar el descriptor de acceso por primera vez en un hilo que no es el hilo principal.

Cualquier objeto que cree que sólo puede liberar en cualquier momento. (Suponiendo que se crea, y lo pondrá de propiedades.)

self.myObject = [[myObjectClass alloc] init];
    // do something with the object
   [self.myObject release];       // anytime that you are not using the object

self.myObject = nil; // will also work if you've set the @property (retain, nonatomic)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top