Domanda

Nel mio codice, ho utilizzare un oggetto Singleton come un punto centrale nella mia app per caricare le immagini e cache l'applicazione ha bisogno di frequente, in modo da non devo fare l'allocazione di memoria ad alta intensità di risorse ogni volta che caricare un'immagine.

Ma ci sono momenti durante l'esecuzione della mia applicazione dove l'utilizzo della memoria diventa intenso e vorrei rilasciare i dati di immagine memorizzati nella cache. Attualmente, sto solo rilasciando le istanze UIImage dal mio Singleton quando ricevo un avviso di memoria.

Io preferirei, tuttavia, per essere in grado di rilasciare l'intero oggetto Singleton. È possibile? Se sì, come?

È stato utile?

Soluzione

Certo che lo è. Anche se è piuttosto probabile che l'utilizzo della memoria di questo oggetto è trascurabile rispetto alle immagini.

Per la natura di un Singleton, è necessario disporre di una funzione di accesso per esso, dove si crearlo se attualmente non esiste:

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

    return mySingleton;
}

Hai solo bisogno di aggiungere un altro che si chiama quando si vuole distruggerla:

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

Se si mantiene riferimenti ad esso intorno altrove avrete difficoltà; non farlo. Se si accede da più thread è necessario eseguire la sincronizzazione. In caso contrario, è abbastanza semplice -. Il getter ricreerà la prossima volta che ne ha bisogno

Altri suggerimenti

Ecco un esempio di una funzione di accesso Singleton per il codice OpenAL che sto utilizzando.

  // 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 vuole un po 'per caricare in modo da mantenere un'istanza intorno è esattamente quello che mi serve. Con più di un thread in gioco (non la mia situazione al momento ma voglio il mio codice per essere portato a situazioni in cui questo è il caso) ho messo un blocco su self. @synchronized(self) fa esattamente questo.

Ora allocata la memoria quindi sono responsabile di rilasciarlo. Potrei chiamare [shared_sound_controller autorelease] nel metodo di accesso +sharedController ma questo può rilasciare il regolatore presto, soprattutto quando ho più di un thread e chiamare la funzione di accesso per la prima volta in un filo non è questo il filo principale.

Ogni oggetto creato si può solo rilasciare in qualsiasi momento. (Presumendo di creare e impostare le sue proprietà.)

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top