Question

Dans mon code, j'utiliser un objet singleton comme point central dans mon application pour charger et images cache l'application a souvent besoin, donc je ne dois pas faire l'allocation de mémoire à forte intensité de ressources chaque fois que je charge une image.

Mais il y a des moments pendant l'exécution de mon application où l'utilisation de la mémoire devient intense et je souhaite libérer les données d'image mises en cache. À l'heure actuelle, je suis juste libérer les instances de UIImage de mon singleton quand je reçois un avertissement de mémoire.

Je préfère, cependant, pour être en mesure de libérer l'ensemble de l'objet singleton. Est-ce possible? Si oui, comment?

Était-ce utile?

La solution

Bien sûr, il est. Bien qu'il soit assez probable que l'utilisation de la mémoire de cet objet est négligeable par rapport aux images.

Par la nature d'un singleton, vous devez avoir un accesseur pour elle, où vous allez créer si elle n'existe pas actuellement:

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

    return mySingleton;
}

Vous avez juste besoin d'ajouter une autre que vous appelez lorsque vous voulez détruire:

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

Si vous gardez les références à elle vous autour ailleurs aura du mal; ne pas le faire. Si vous accédez à partir de plusieurs threads vous devez synchroniser. Sinon, il est assez simple -. Getter recréera lors de votre prochaine besoin il

Autres conseils

Voici un exemple d'un accesseur singleton pour le code OpenAL J'utilise.

  // 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 prend un certain temps pour charger donc garder une instance est exactement autour de ce que je dois. Avec plus d'un fil dans le jeu (pas ma situation actuellement mais je veux que mon code pour être porté à des situations où cela est le cas), je mets un verrou sur self. @synchronized(self) fait exactement cela.

Maintenant, je la mémoire alloué donc je suis responsable de le relâcher. Je pourrais appeler [shared_sound_controller autorelease] dans la méthode accesseur +sharedController ce qui peut libérer tôt le contrôleur, en particulier quand j'ai plus d'un fil et j'appelle l'accesseur pour la première fois dans un fil qui est pas le fil principal.

Tout objet que vous pouvez créer simplement libérer à tout moment. (En supposant que vous créez et définir les propriétés de it.)

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top