2010-04-05 6 views
1

Si je crée une chaîne avec [NSString StringWithFormat], dois-je la [conserver]? Ma compréhension est que les méthodes de commodité ajoutent les objets au pool autorelease. Si tel est le cas, ne devrions-nous pas conserver l'objet afin qu'il ne soit pas drainé avec pool à la fin de la boucle d'événement?Objectif C NSString Conserver

Répondre

1

Si la chaîne doit persister au-delà de la fonction en cours, alors oui, l'objet qui en a besoin doit le conserver. Voici un de ces endroits où le phrasé anglais semble banal mais dissimule en réalité un concept clé. Plutôt que de dire "dois-je le retenir?" ou (comme je l'ai écrit à l'origine) "si vous voulez que la chaîne persiste", parlez en termes d'un objet en conservant la chaîne. La différence est que ce dernier exprime le concept de ownership (note: la documentation d'Apple utilise "vous" quand on parle de propriété, mais c'est un "neutre" à la troisième personne plutôt qu'un "vous" à la deuxième personne). Bien sûr, si vous stockez la chaîne dans un property, la conservation (ou la copie) est gérée pour vous. Sauf si vous devez cibler des versions plus anciennes d'OS X (10.4 et versions antérieures), vous devez généralement utiliser les propriétés.

Les collections standard possèdent les objets qu'elles contiennent et les conservent ainsi. Lorsqu'un élément est retiré d'une collection, la collection libère l'élément (note: ils ne sont pas autorelease, donc si l'objet n'a pas d'autres propriétaires, l'objet sera détruit). En savoir plus sur ce sujet dans "Validity of Shared Objects". La documentation memory management d'Apple devrait vous indiquer tout ce que vous devez savoir.

+0

Merci beaucoup. Je suis un programmeur Java, d'où les concepts de propriété etc. ne coule pas encore naturellement :) Une autre question connexe, si je crée un NSArray (en utilisant [new]) de NSString, alors, est-il correct que je n'ai pas besoin de conserver le NSString plus, car il est maintenant détenu par le NSArray qui est la propriété de moi. Par conséquent, si je conserve/libère correctement mon NSArray, les NSStrings qu'il contient seront toujours implicitement conservés/libérés par moi. Nous supposons que j'ai besoin que NSArray et ses membres NSStrings soient disponibles tout au long du cycle de vie de l'application. – Amarsh

+0

@Amarsh: correct à propos de NSArray. La réponse mise à jour donne un peu plus de détails. – outis

+0

Merci encore une fois. Une autre question dans le même contexte. -je ajouter un objet comme suit: [someNSArray addObject: [SomeClass alloc]] et plus tard, appelez: [someNSArray removeAllObjects] Dans ce cas, sera mon objet SomeClass obtenir désallouée par lui-même? Ma confusion fondamentale est, dans les cas où nous allouer-un objet et l'ajouter à une collection, qui est le propriétaire, la collection ou vous ... ou les deux? – Amarsh