2010-12-14 50 views
1

Je suis curieux de l'allocation de mémoire pour le code suivant.Comment les @ "Strings" sont-ils alloués en mémoire?

NSString *myString = [NSString string]; 

Je sais que cela va créer une chaîne vide autoreleased, @""

Qu'est-ce qui se passe quand je puis appeler

myString = @"Hello world"; 

Est ma référence la même chose que l'objet autoreleased NSString fourni ou j'ai fait juste allouer un nouvel objet que je suis responsable de la libération?

Répondre

8

Quand on se demande si vous possédez un objet, demandez-vous:

Est-ce que la méthode que je l'habitude de créer cet objet ...

  • commencent par new?
  • commencer par alloc?
  • contiennent copy?
  • est égal à retain?

Si vous pouvez répondre « oui » à l'un de ceux, alors vous êtes chargé d'invoquer release ou autorelease sur l'objet retourné. (Notez que les règles pour les objets Core Foundation sont légèrement différent. Notez également que tout ce que la documentation dit explicitement contredit cette victoire.) La documentation remplace toujours les directives)

Dans le cas de votre chaîne, les réponses à toutes vos questions sont "non", vous n'êtes donc pas responsable de l'objet. Les chaînes constantes (du style @"foo") sont codées en dur dans le fichier binaire de l'application et ne peuvent pas être désaffectées. Cela, cependant, est un détail de mise en œuvre. Tant que vous suivez les règles de gestion de la mémoire, vous serez bon!

+1

Récemment, j'ai lu un très bel article sur la gestion de la mémoire http://goo.gl/Tp8WW J'espère que cela vous aidera à mieux comprendre. –

+0

Merci, je suis généralement très à l'aise avec la gestion de la mémoire Cocoa, j'étais un peu perplexe sur la façon dont les cordes dur codées fonctionnent. –

+1

@ Flash84x: Le détail de l'implémentation qui empêche la libération est que les chaînes constantes ont un nombre de rétention de INT_MAX. Ceci est traité comme un cas spécial par le temps d'exécution et transforme 'retel' et' release' en no-ops. – JeremyP