La création d'un tableau d'objets personnalisés en Objective-C
MODIFIER
Ce que je suis en train de réaliser avec le code, est de créer un tableau de 20 unique 'Personne' objets. Je sais maintenant, grâce à des gars ci-dessous que je vais loin d'appel dealloc.
for (int i = 0; i < 20; i++)
{
Person *myPerson = [[Person alloc] init];
myPerson.name = @"Brian";
myPerson.age = [NSNumber numberWithInteger:23];
[myArray addObject:myPerson];
[myPerson dealloc];
}
Dans le processus d'apprentissage Objective-C, donc pourquoi ce code peut sembler fou pour vous. Mais je suis en provenance de Java donc ma logique n'est pas idéal pour Objectif C encore.
J'ai essayé de remplir mon tableau avec 20 objets de la personne. Mais il semble que je suis l'ajout de l'Objet même personne tout le temps. Puis en libérant de ce qui va à l'encontre du point.
Donc ma question est: Quelle serait la bonne façon de remplir le tableau avec 20 différents objets de la personne. Les noms et les âges seront différentes dans le futur pour chaque personne, mais à l'instant où elles sont toutes les mêmes, alors que j'apprends.
Est le seul moyen de ce faire taper beaucoup de code comme ceci :
Person *myPerson1 = [[Person alloc] init];
myPerson.name = @"Brian";
myPerson.age = [NSNumber numberWithInteger:23];
[myArray addObject:myPerson1];
Person *myPerson2 = [[Person alloc] init];
myPerson.name = @"Brian";
myPerson.age = [NSNumber numberWithInteger:23];
[myArray addObject:myPerson2];
Person *myPerson3 = [[Person alloc] init];
myPerson.name = @"Brian";
myPerson.age = [NSNumber numberWithInteger:23];
[myArray addObject:myPerson3];
20 fois? Ou est-il une solution plus élégante?
Merci pour vous conseils.
-Code
OriginalL'auteur | 2010-09-05
Vous devez vous connecter pour publier un commentaire.
Votre boucle de code est correct, à l'exception de la désallocation de myPerson à la fin de la boucle. Vous ne voulez pas désallouer puisque l'objet est conservé par le tableau. En général, vous ne voulez pas invoquer dealloc directement, vous souhaitez utiliser à retenir/libérer la place. Pour plus d'informations à propos de la gestion de la mémoire découvrez Apple Guide de l'
De sorte que vous êtes correct, à l'exception de dealloc être changé à la libération.
dealloc
est à la fin d'une classe de remplacerdealloc
, auquel cas, vous allez écrire[super dealloc]
. Toute autre utilisation est presque certainement faux.Mais n'est-il pas vrai de dire que j'ai un tableau contenant 20 exemplaires d'un même objet(20 pointeurs vers le même objet)? Ce que je suis en train de faire(et ne pas comprendre comment), c'est d'ajouter 20 objets uniques.
Non, vous n'avez pas 20 pointeurs vers le même objet. Un nouvel objet est créé chaque fois que vous écrivez
[[Person alloc] init]
, ce que vous faites chaque itération de la boucle. Il pourrait avoir regardé comme c'est ce qui se passait avec le code cassé, parce que chaque fois que vousdealloc
ed l'objet, son emplacement de mémoire a été libérée et l'objet suivant a été alloué à la même adresse.Comme vous le voyez sur la réponse de DHamrick ici, et de Rob réponse, soit vous devez autorelease
myPerson
ou la libérationmyPerson
. L'appel dedealloc
est tout simplement faux. Les deux bonnes techniques sont à la fois très bien, mais pour votre compréhension de l'Objective-C (en particulier pour l'iPhone, où les Déchets-Collecte n'est pas pris en charge), il est très important que vous compreniez les deux techniques.Yep, vous devez. Fondamentalement, vous devez penser à des pointeurs en termes de owernship. Votre principal objet possède le tableau, et votre tableau possède chaque
Person
qui y sont. Contrairement au monde réel, cependant, la propriété n'est pas exclusive-un autre objet pourrait également propriétaire de votre tableau, sans "dilution" de votre propriété. Vous le signal de la "prise" et de "l'abandon" de la propriété avec leretain
etrelease
méthodes. Lorsque votre objet meurt (c'est à dire dansdealloc
), vous devez vous assurer qu'il renonce à toutes les propriétés qu'il peut détenir.OriginalL'auteur DHamrick
Probablement la plus simple et la plus "obj-c" façon de le faire serait de créer une méthode de classe sur la personne qui crée la personne que vous voulez. Tout comme
[NSString stringWithFormat]
, vous seriez de retour d'un autoreleased objet, de sorte que l'appelant n'a même pas besoin de le libérer.Ne jamais appeler
dealloc
vous-même - la confiance dansrelease
Maintenant, vous serez en mesure d'ajouter à chaque personne de la matrice en une seule ligne, sans fuite de mémoire
Pour en savoir plus: http://www.cocoadev.com/index.pl?AutoRelease
OriginalL'auteur Rob Fonseca-Ensor
Comme DHamrick écrit, vous ne devriez pas
dealloc
l'objet que vous créez, c'est la même que la suppression de l'objet. Il a été ajouté à la matrice, ce qui a égalementretained
. Mais comme vous dans la boucle crée un nouvel objet, je peux imaginer le nouvel objet sera la même adresse que précédemment supprimé et donc le vieux pointeurs sera à nouveau le point sur ce nouvel objet, vous faisant croire qu'ils sont une seule et même chose. La chasse aux bogues comme cela, je vous suggère de regarder dans l'activation NSZombie.http://iosdevelopertips.com/debugging/tracking-down-exc_bad_access-errors-with-nszombieenabled.html
OriginalL'auteur epatel
Ici est le moyen de créer un tableau d'objet
L'objet est d'obtenir la valeur de dictionnaire dans lequel j'ai stocké des objets et de la clé et la valeur comme un objet de EmpDesignation classe ..
c'est l'objectif c désolé pour les complications
Pas besoin de s'excuser, après tout vous êtes à essayer d'aider les gens d'ici. Mais je pense que vous devez formater votre code mieux.
OriginalL'auteur Prashant Tukadiya