2010-08-18 10 views
1

Donc j'essaye d'enregistrer des tableaux dans un NSDictionary à la volée. Laissez-moi vous montrer le code et expliquer ce qui se passe.Question de fonctionnalité NSDictionary

for (int x= 0; x <[appDelegate.people count]; x++) { 
    Person *aPerson = [[Person alloc] init]; 
    aPerson = [appDelegate.people objectAtIndex:x]; 
    if ([appDelegate.groupedBusiness objectForKey:aPerson.business_name] == nil) { 
     NSMutableArray *newBusiness = [[NSMutableArray alloc] init]; 
     //if the business does not exist in the dict, add the person to the business and add it to dict. 

        [newBusiness addObject:aPerson]; 

     [appDelegate.groupedBusiness setObject:newBusiness forKey:aPerson.business_name]; 

     [newBusiness release]; 
     newBusiness = nil; 
     //NSLog(@"%@", appDelegate.groupedBusiness); 
    } else { 
     NSMutableArray *existingBusiness= [appDelegate.groupedBusiness objectForKey:aPerson.business_name]; 
     [existingBusiness addObject:aPerson]; 
        //THIS IS THE LINE I AM NOT SURE ABOUT!!! 
     [appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name]; 

     [existingBusiness release]; 
     existingBusiness = nil; 
     //NSLog(@"%@", appDelegate.groupedBusiness); 
    } 

} 

Bon, le appDelegate a un tableau de « peuple » qui a un tas d'attributs sur une personne. J'essaie de mettre en place un dictionnaire pour les trier par leur nom d'entreprise. Je fais cela en créant un tableau et en l'enregistrant dans le dictionnaire avec le nom de l'entreprise comme clé. Chaque itération de la boucle que je vérifie pour voir si la clé existe, si c'est le cas, retirez le tableau existant, ajoutez la personne que vous vérifiez et réenregistrez-la dans le dictionnaire. Cependant, cela ne semble pas se produire. Y a-t-il un comportement exotique dans la classe NSDictionary qui empêcherait cela? J'ai versé sur la page Web de la classe et ne trouve rien. Désolé si c'est une question noobie, j'essaie toujours de comprendre les classes objectives-c. Merci!

+0

ne pas faire avec votre question, mais Personne * aPerson = [[Person alloc] init]; aPerson = [appDelegate.people objectAtIndex: x]; fuira, vous allouant un objet Personne et l'assignant à aPerson et ayant ensuite cette variable point à autre chose, maintenant vous avez un objet Personne alloué qui n'est pas référencé et a un nombre de retenue de 1 – Daniel

+0

Merci, noté, je vais réparer cette. Au départ, ce n'était pas comme ça, mais je l'ai changé pour une raison ou une autre. Je ne me souviens pas pourquoi. – gabaum10

Répondre

2

Pourquoi lancez-vous l'entreprise existante? Vous ne créez pas d'objet, prenez simplement le pointeur d'un tableau. Lorsque vous invoquez release, retainCount devient 0 et les objets deallocs.

Il suffit de retirer les deux lignes suivantes:

[existingBusiness release]; 
existingBusiness = nil; 

et tout devrait bien fonctionner.

+0

C'était tout! Merci, je suis vraiment aux prises avec la gestion de la mémoire dans ce système. Quand relâchez-vous et quand ne le faites-vous pas? – gabaum10

+1

Vous libérez un objet auquel vous avez envoyé [alloc], [copy] ou [retain]. Aucun autre. – eliego

0
[appDelegate.groupedBusiness setObject:existingBusiness forKey:aPerson.business_name]; 

    [existingBusiness release]; 
    existingBusiness = nil; 

Tout devrait être enlevé. L'objet existant est déjà dans la dict, et il s'agit d'un objet mutable - lorsque vous ajoutez une personne, cela sera reflété dans le dictionnaire et c'est le même objet que vous avez affaire. En dehors de cela, vous avez quelques fuites de mémoire comme le souligne Daniel.

+0

Donc l'objet n'est pas recréé à chaque itération de la boucle? Je veux créer une nouvelle paire clé-valeur si le nom commercial de la personne n'existe pas dans la dict. – gabaum10

2

Vous êtes trop compliqué, pour ne pas mentionner quelques fuites.

for (Person *aPerson in appDelegate.people) { 
    NSMutableArray *business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name]; 
    if (!business) { 
     business = [NSMutableArray array]; 
     [appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name]; 
    } 

    [business addObject:aPerson]; 
} 
+0

Je ne pense pas que ce soit ce que je veux faire. Je veux créer une nouvelle paire clé-valeur lorsque le nom de l'entreprise de la personne n'existe pas dans la dict. La pensée est que je vais juste vérifier par rapport à cela et ajouter les gens du même nom d'entreprise à ce tableau au lieu d'en créer de nouveaux. Je ne créerai un nouveau tableau que si le nom de l'entreprise n'existe pas dans la dict. – gabaum10

+0

@ gabaum10: c'est exactement ce que je fais sur la 4ème ligne. – jtbandes

+0

Ah, ok je suppose que j'ai juste mal interprété cela. De toute façon je l'ai réparé. Merci de votre aide! – gabaum10

1

Pas une réponse, mais quelques problèmes de style de codage.

Utilisez itération rapide si vous n'avez pas besoin de l'index:

for (Person *aPerson in appDelegate.people) { 

utilisation constructeurs de proximité; il rend votre code plus lisible (souvenez-vous de retirer le « libération » à la fin):

NSMutableArray *newBusiness = [NSMutableArray arrayWithObject:aPerson]; 

Évitez la logique en double, si possible:

NSMutableArray * business = [appDelegate.groupedBusiness objectForKey:aPerson.business_name; 
if (!business) { 
    business = [NSMutableArray array]; 
} 
[business addObject:aPerson]; 
[appDelegate.groupedBusiness setObject:business forKey:aPerson.business_name]; 

Le « setObject: existingBusiness » appel ne ne change rien à part de gaspiller des cycles CPU, mais dans le cas ci-dessus, il rend le code un peu plus lisible.

+0

Ah, c'est logique maintenant. Donc, lorsque vous utilisez un tableau mutable, vous n'avez pas à le redéclairer à chaque itération de la boucle si c'est là qu'il est initialisé? Je vois maintenant. Je vais en lire plus sur la gestion de la mémoire. C'est ce qui me lance vraiment en boucle. – gabaum10

+0

Je ne suis pas sûr de ce que vous voulez dire par "vous n'avez pas à le redéclairer à chaque itération de la boucle si c'est là qu'il est initialisé". [Tableau NSMutableArray] est équivalent à [[[NSMutableArray alloc] init] autorelease]. –