2009-08-27 4 views
0

ビューの上部にsegmentedControlを持つnavigationBarを持つテーブルビューがあります。 "FirstName"または "LastName"のいずれかでテーブルをソートするボタン付きのsegmentedControlを設定しました。ソートボタンを押すたびに最初の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

はあなたのループの最後でeachItemListを解放しないでください。この文脈で明示的に割り当てるのではありません。

ループfor (object in array)ループは、コピーではなく配列内のオブジェクトへの参照を提供します。この参照にリリースメッセージを送信することで、このオブジェクトが配列内にある間にこのオブジェクトの保持カウントが減少します。数回後(オブジェクトが何回保持されたかによって、オブジェクトに配列が追加されたときなどにオブジェクトが保持されます)、保持カウントは0になり、割り当てが解除され、認識されなくなるとクラッシュしますセレクタまたはEXC_BAD_ACCESSと、おそらく他の種類のエラーです。

+0

素晴らしい!これにより、クラッシュする前にソート方法を約6回切り替えることができました。私はその後、tempSectionedDictionaryByFirstLetterのリリースをやめ、今は完全に動作します。これは私が割り当てたので、これはメモリ管理に反するようです。どのようなアイデアをリリースするか? ありがとう! – Jonah

関連する問題