多次排序数据时表崩溃

时间:2009-08-27 05:34:20

标签: iphone objective-c uitableview sorting

我有一个带有navigationBar的tableview,在视图的顶部有一个segmentedControl。我已经设置了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 个答案:

答案 0 :(得分:1)

不要在循环结束时释放eachItemList。您没有在此上下文中明确分配它,因此您不应该将其释放。

for (object in array)循环为您提供对数组中对象的引用,而不是副本。通过向此引用发送释放消息,您将在该对象仍在数组中时减少该对象的保留计数。几次之后(取决于保留对象的次数,NSArray例如在将对象添加到数组时保留对象)它的保留计数将达到0,然后它将被取消分配,你将会遇到无法识别的选择器或EXC_BAD_ACCESS以及可能的其他类型的错误。