Сбой таблицы при многократной сортировке данных - PullRequest
0 голосов
/ 27 августа 2009

У меня есть табличное представление с панелью навигации с сегментированным элементом управления в верхней части представления. Я настроил segmentedControl с помощью кнопок, которые сортируют таблицу по «FirstName» или «LastName». Он отлично работает первые 2-4 раза, когда вы нажимаете кнопки сортировки, но затем приложение вылетает.

Похоже, что отладчик и консоль не помогут найти источник ошибки. Кто-нибудь видит какие-либо явные ошибки в моем коде?

Вот мой код ниже, дайте мне знать, если у вас есть какие-либо вопросы. Спасибо!

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

}

1 Ответ

1 голос
/ 27 августа 2009

Не отпускайте eachItemList в конце вашего цикла. Вы явно не выделяли его в этом контексте, поэтому не следует его освобождать.

Цикл for (object in array) дает вам ссылку на объект в массиве, а не на копию. Отправляя сообщение об освобождении по этой ссылке, вы уменьшаете счетчик сохранения этого объекта, пока он еще находится в массиве. Через несколько раз (в зависимости от того, сколько раз объект был сохранен, NSArray, например, сохраняет объекты, когда они добавляются в массив), его счетчик сохранения достигнет 0, и затем он будет освобожден, и вы получите сбой в отношении нераспознанных селекторов или EXC_BAD_ACCESS и, возможно, других видов ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...