Tabela falhas durante a classificação dos dados várias vezes

votos
0

Eu tenho um tableview com uma NavigationBar com um segmentedControl no topo da exibição. Eu configurei o segmentedControl com botões que classificar a tabela por qualquer um Nome ou Apelido. Ele funciona perfeitamente a primeira 2-4 de vezes que você pressionar os botões de classificação, mas, em seguida, o aplicativo trava.

O depurador eo console parecem ser de nenhuma ajuda para encontrar a fonte do erro. Alguém vê erros gritantes no meu código?

Aqui está o meu código abaixo, deixe-me saber se você tiver quaisquer perguntas. Obrigado!

- (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];

}
Publicado 27/08/2009 em 06:34
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Não solte eachItemListno final do seu ciclo. Você não alocar explicitamente neste contexto para que você não deve liberá-lo.

O for (object in array)circuito dá-lhe uma referência para o objeto na matriz, não uma cópia. Ao enviar uma mensagem de libertação para esta referência, você está diminuindo a contagem deste objeto reter enquanto ele ainda está na matriz. Depois de algumas vezes (dependendo de quantas vezes o objeto foi mantida, NSArraypor exemplo, mantém objetos quando eles são adicionados à matriz) é manter a contagem vai chegar a 0, e se tornará então desalocada e você vai ter acidentes em relação seletores não reconhecidos ou EXC_BAD_ACCESSe possivelmente outros tipos de erros.

Respondeu 27/08/2009 em 07:10
fonte usuário

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