Tableau des accidents lors du tri des données à plusieurs reprises

voix
0

J'ai un tableview avec un navigationBar avec un segmentedControl sur le haut de la vue. J'ai mis le segmentedControl avec des boutons qui trient la table soit « FirstName » ou « LastName ». Il fonctionne parfaitement le premier 2-4 de fois que vous appuyez sur les boutons de tri, mais les application se bloque.

Le débogueur et la console semblent être d'aucune aide pour trouver la source du bug. Quelqu'un voit-il des erreurs flagrantes dans mon code?

Voici mon code ci-dessous, laissez-moi savoir si vous avez des questions. Merci!

- (IBAction)sortingSegmentAction:(id)sender{

NSString *keyToSortBy = [NSString alloc];

if([sender selectedSegmentIndex] == 0)
{
    self.sortingSegmentActionPressed = 0;
    keyToSortBy = @FirstName;
}
else if([sender selectedSegmentIndex] == 1)
{
    self.sortingSegmentActionPressed = 1;
    keyToSortBy = @LastName;
}

    //Create the sort descriptors
    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:keyToSortBy ascending:YES] autorelease];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    //Sort allSubItams by the values set in the sort descriptors
    NSArray *sortedArray;
    self.sortedArray = [allSubItems sortedArrayUsingDescriptors:sortDescriptors];

    //Recreate the data structure by putting the newly sorted items into a dictionary sorted by inital letters.
    NSDictionary *eachItemList;  //A DICTIONARY FOR PUTTING ALL THE DATA FOR EACH ITEM IN IT'S OWN SECTION
    NSMutableDictionary *tempSectionedDictionaryByFirstLetter = [[NSMutableDictionary alloc] init];

    for (eachItemList in sortedArray)   //eachElementList is a dictionary with a section for each item
    {
        NSDictionary *aDictionary = [[NSDictionary alloc] initWithDictionary:eachItemList];
        NSString *firstLetterString;
        firstLetterString = [[aDictionary valueForKey:keyToSortBy]substringToIndex:1];
        NSMutableArray *existingArray;
        if (existingArray = [tempSectionedDictionaryByFirstLetter valueForKey:firstLetterString]) 
        {
            [existingArray addObject:eachItemList];
        } else {
            NSMutableArray *tempArray = [NSMutableArray array];
            [tempSectionedDictionaryByFirstLetter setObject:tempArray forKey:firstLetterString];
            [tempArray addObject:eachItemList];
        }
        [aDictionary release];
        [eachItemList release];
    }

 //Set the data source for the table (sectionedDictionaryByFirstLetter) to tempSectionedDictionaryByFirstLetter.
    self.sectionedDictionaryByFirstLetter = tempSectionedDictionaryByFirstLetter;
    NSMutableArray *keyArray = [[NSMutableArray alloc] init];
    [keyArray addObjectsFromArray:[[self.sectionedDictionaryByFirstLetter allKeys] sortedArrayUsingSelector:@selector(compare:)]];
    self.keys = keyArray;

    [self.tableView reloadData];

    [keyArray release];
    [tempSectionedDictionaryByFirstLetter release];

}
Créé 27/08/2009 à 06:34
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Ne relâchez pas eachItemListà la fin de la boucle. Vous ne l' avez pas explicitement allouez dans ce contexte , de sorte que vous ne devriez pas le libérer.

La for (object in array)boucle vous donne une référence à l'objet du tableau, pas une copie. En envoyant un message de libération à cette référence, vous décrémentation Retain comte de cet objet alors qu'il est encore dans le tableau. Après quelques temps ( en fonction du nombre de fois que l'objet a été retenu, NSArraypar exemple conserve des objets lorsqu'ils sont ajoutés au tableau) , il est de conserver le nombre atteindra 0, et il deviendra alors désalloué et vous obtiendrez des accidents en ce qui concerne les sélecteurs non reconnus ou EXC_BAD_ACCESSet éventuellement d' autres types d'erreurs.

Créé 27/08/2009 à 07:10
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more