6
votes

La bonne façon de déclarer, alloc, charge et dealloc un nsmutablarray

Je déclare mon tableau dans mon * .h Fichier:

x = 12;
x = 24;


2 commentaires

Je sais que ce post fait vie à l'heure d'Internet, mais j'aimerais préciser que, dans le développement du cacao, nous ne manipulons pas vraiment de manipuler des données de données eux-mêmes, mais plutôt des indicateurs. Gardez cela à l'esprit à tout moment et gardez à l'esprit que vous devez faire très attention à l'affectation du pointeur.


J'aimerais pouvoir vous donner plus d'un vote à l'UP - j'ai exactement les mêmes problèmes - l'objectif c est au-delà du contre-intuitif.


3 Réponses :


11
votes

Vous ne chargez pas votre tableau avec xxx pré>

à la place, vous le remplacez par une nouvelle instance et pire: avec une instance, dont la référence est en fait la propriété de certaines entités que vous ne trouvez pas Contrôle (probablement, un nsautoreleeepool code>.) La référence que vous possédez correctement, celle créée par p> xxx pré>

est perdue et sera divulguée. p>

au lieu de remplacer toute la référence de la matrice, Mutate celle que vous avez déjà à votre disposition, en utilisant par exemple addObject: code> comme p> xxx pré>

etc. Afin de dégager les anciennes valeurs, la méthode removeallobject code> peut être pratique. Il existe également des méthodes de mutation, qui peuvent être utilisées pour ajouter de multiples valeurs à la fois. P>

Alternativement, vous pouvez également affecter la matrice à l'aide de la méthode de construction que vous utilisez déjà, mais faites attention à le retenir. Dans ViewDiDloadload CODE> DO P>

anArray = [[NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil] retain];


0 commentaires

4
votes

Le problème est anarray = [NsmutableArraRay ArraywithObjects: @ "One", @ "Deux", @ "Three", Nil]; Ceci remplace la matrice que vous avez initialement créée. Le problème de le faire est que ce nouveau tableau n'est pas conservé, vous le perdez donc dès que la méthode revient. En outre, vous avez une fuite de mémoire parce que vous n'avez jamais libéré le tableau d'origine.

Il existe plusieurs façons de résoudre ce problème, mais il est à utiliser [version anarray]; anarray = [[[[NsmutableArraRay ArraywithObjects: @ "Un", @ "Deux", @ "Three", Nil] Conserver]; .

Un autre, probablement plus correct de résoudre ce serait d'utiliser le addObject: ou addObjectsfromarray: nsmutableArray méthodes au lieu de créer constamment de nouvelles tableaux.


0 commentaires

3
votes

N'oubliez pas que cette règle de mémoire simple: Seulement libérer des objets que vous possédez strong>. Vous possédez des objets uniquement lorsque vous les créez à l'aide de:

  • init code> (cette méthode crée un nouvel objet avec un nombre de retenue de 1) em> li>
  • nouveau code> (cette méthode est la même que d'utiliser alloc et init) em> li>
  • copie code> (cette méthode crée un nouvel objet avec un nombre de retenue de 1 et avec le contenu du récepteur de la méthode) em> li>
  • conserver code> (cette méthode augmente le nombre de retenue avec 1) em> li> ul>

    Le système DealLoc code> ATES Les objets automatiquement avec un nombre de retenue de zéro. Vous devez libérer code> chaque objet que vous possédez après que vous soyez terminé. Si vous Libération Code> Trop tôt, vous obtenez une situation dangereuse. Si vous ne NE PAS CODE> Votre objet Lorsque vous en avez terminé, vous obtenez une fuite. P>

    Un pointeur est un objet spécial qui fait référence à un objet en mémoire. C'est fondamentalement une adresse mémoire (et d'autres données). Si vous souhaitez utiliser un objet, vous devez ATELO CODE> METTE MÉMOIRE POUR IT, puis INIT CODE> IALIZE. Vous assignez (en utilisant le signe = code> signe) sur un pointeur. P>

    NSArray *myArray = [NSArray arrayWithObjects: @"Butter", @"Milk", @"Honey", nil];
    


2 commentaires

Avez-vous besoin de boucler à travers tous les éléments de la matrice et d'appeler la libération sur chacun avant?


@tivo Si vous utilisez ARC (qui correspond à la valeur par défaut de Xcode), vous n'utilisez jamais version complètement. ;-)