Je suis un débutant iPhone / Objective-C avec un fond de Java étendu.
J'apprends plus sur la gestion de la mémoire dans l'objectif-C et je lis la documentation d'Apple sur la gestion de la mémoire: http://developer.apple.com/iphone/library/documentation/cocoa/ Conceptual / MemoryMGMT / MemoryMGMT.HTML P>
Dans la section Politique de propriété de l'objet, il vous écrit que vous possédez un objet que vous créez via une méthode qui commence avec ALLOC, NOUVEAU ou contient une copie. La propriété implique que vous devez explicitement Donc, je regarde la documentation NsmutableArray: http://developer.apple.com/mac/library/documentation/ Cacao / référence / fondation / classes / nsmutableArray_class / référence / référence.html p> Il y a deux méthodes qui font à peu près la même chose ... ils créent tous les deux un tableau avec une certaine capacité initiale. On est une méthode de classe et l'autre est une méthode d'instance. P> libérer code> l'objet lorsque vous avez terminé. P>
+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;
3 Réponses :
Vous choisirez généralement si vous allez ou non posséder l'objet pour plus de la durée de vie de la méthode actuelle (par exemple, attribuez-la à une statique ou directement à un ivar). Dans ce cas, vous pouvez utiliser la méthode ALLOC / INIT puisque vous savez que vous voulez le posséder déjà. Si vous envisagez de l'utiliser uniquement pour la portée de la méthode actuelle ou que vous l'attribuez à quelque chose géré comme une propriété, vous utiliseriez probablement la méthode de la commodité. P>
Si vous savez que vous allez posséder un objet que vous créez, l'appel ALLOC / INIT est toujours plus efficace que la commodité / retenue de la manière que ce dernier est nécessaire pour alloc / init / init / init. Vous le conservez quand il est retourné. P>
Vous pouvez également utiliser les méthodes Alloc / init directes lorsque vous allouez dans une boucle et que vous n'avez pas besoin / que vous souhaitez gérer une piscine Autoréleuillet. P>
Est-ce plus vrai maintenant que nous avons un comptage automatique de référence? Il me semble que les deux méthodes doivent être à peu près identiques maintenant que le code de l'ARC applique essentiellement une autorelease implicite à l'objet ALLOC / INIT créé maintenant. Cela voudrait que la plupart des cas devrions utiliser les méthodes de commodité maintenant, si cela existe pour la simplicité et la clarté, car il n'y a pas de pénalité de performance, si je comprends bien cela correctement.
Dans ce cas, j'essaie de coller aux règles suivantes pour éviter la mémoire lié à la mémoire (== "très méchant") Bugs: P>
ArraywithCapacité: a déjà l'autorelease appliquée à elle.
InitiplicwithCapacité: est explicitement retenu et vous devrez le libérer vous-même. Depuis que vous l'appelez généralement comme [[A Alloc] Init ...], cela déclenchera une lightbulb "Je dois gérer la mémoire pour cela", "d'autres mots magiques similaires à part" Alloc "étant" Nouveau "et" Copier "comme Vous avez lu dans le Guide de gestion de la mémoire. Mais de votre question, on dirait que vous comprenez bien les principes de cette question. P>
Vous avez raison que vous devriez garder votre empreinte de mémoire gérée et faible, mais cela ne signifie pas que vous devez toujours faire explicitement init / Libération. Comme Nick dit, on utilise un cas pour utiliser les méthodes d'usine d'autoréléase, c'est lorsque vous les transmettez en tant que paramètres. P>
Un autre exemple est que lorsque vous ajoutez quelque chose à une collection comme NSDictionary ou Nsarray, que "quelque chose" peut être créé avec la méthode de l'usine Autoréleuillet, puisque la collection "prend le dessus" le retenant. (Les choses sont conservées lorsqu'elles sont ajoutées à la collecte et sont libérées lorsqu'elles sont supprimées.) P>
Vous pouvez affirmer que P>
Blah *blah = [[Blah alloc] initWithSomething]; [myMutableArray addObject:blah]; [blah release];