2011-01-10 36 views
1

給定一個基本的鍵/值數組,我想存儲兩個基於原始數組的排序數組:一個數組將按名稱排序,另一個按年齡排序。存儲導致EXC_BAD_ACCESS的排序數組錯誤

當我將它們輸出到日誌時,數組似乎正確排序;但是,當我嘗試在代碼的其他地方訪問它們時,我收到了一個EXC_BAD_ACCESS錯誤。

這是我到目前爲止有:

// MyController.h 

@interface MyController : UIViewController { 
    NSMutableArray *originalArray; 
    NSMutableArray *nameArray; 
    NSMutableArray *ageArray; 
} 

@property (nonatomic, retain) NSMutableArray *originalArray; 
@property (nonatomic, retain) NSMutableArray *nameArray; 
@property (nonatomic, retain) NSMutableArray *ageArray; 

-(void)someRandomMethod; 

@end 


// MyController.m 

#import "MyController.h" 

@implementation MyController 

@synthesize originalArray; 
@synthesize nameArray; 
@synthesize ageArray; 

-(void)viewDidLoad { 

    // originalArray = (
    // { 
    //  "name" = "Sally"; 
    //  "age" = 18; 
    // }, 
    // { 
    //  "name" = "Chad"; 
    //  "age" = 26; 
    // }, 
    // { 
    //  "name" = "Carla"; 
    //  "age" = 24; 
    // }, 
    //) 

    // sort by name 
    NSSortDescriptor *sortByNameDescriptor; 
    sortByNameDescriptor = [[[NSSortDescriptor alloc]    
            initWithKey:@"name"                
            ascending:NO] autorelease]; 
    NSArray *sortByNameDescriptors = [NSArray arrayWithObject:sortByNameDescriptor]; 
    nameArray = [originalArray sortedArrayUsingDescriptors:sortByNameDescriptors]; 

    // sort by age 
    NSSortDescriptor *sortByAgeDescriptor; 
    sortByAgeDescriptor = [[[NSSortDescriptor alloc]    
            initWithKey:@"age"                
            ascending:NO] autorelease]; 
    NSArray *sortAgeDescriptors = [NSArray arrayWithObject:sortByAgeDescriptor]; 
    ageArray = [originalArray sortedArrayUsingDescriptors:sortByAgeDescriptors];  

    [super viewDidLoad]; 
} 

-(void)someRandomMethod { 
    // whenever I try to access the sorted arrays, I receive the EXC_BAD_ACCESS error 
    [[nameArray objectAtIndex:0] valueForKey:@"name"]; 
    [[ageArray objectAtIndex:0] valueForKey:@"age"]; 
} 

-(void)viewDidUnload { 
    self.originalArray = nil; 
    self.nameArray = nil; 
    self.ageArray = nil; 
    [super viewDidUnload]; 
} 

- (void)dealloc { 
    [originalArray release]; 
    [nameArray release]; 
    [ageArray release]; 
    [super dealloc]; 
} 

@end 

任何想法?

UPDATE:感謝@robin,通過改變上述下面的代碼的代碼,一切都很正常:

// sort by name 
NSSortDescriptor *sortByNameDescriptor; 
sortByNameDescriptor = [[[NSSortDescriptor alloc]    
           initWithKey:@"name"                
           ascending:NO] autorelease]; 
NSArray *sortByNameDescriptors = [NSArray arrayWithObject:sortByNameDescriptor]; 
nameArray = [[NSMutableArray alloc] initWithArray:[originalArray sortedArrayUsingDescriptors:sortByNameDescriptors]]; 

// sort by age 
NSSortDescriptor *sortByAgeDescriptor; 
sortByAgeDescriptor = [[[NSSortDescriptor alloc]    
           initWithKey:@"age"                
           ascending:NO] autorelease]; 
NSArray *sortAgeDescriptors = [NSArray arrayWithObject:sortByAgeDescriptor]; 
ageArray = [[NSMutableArray alloc] initWithArray:[originalArray sortedArrayUsingDescriptors:sortByAgeDescriptors]];  

回答

2

我不認爲你知道這個或沒有,但曾經當你創建一個對象像字符串或數組或字典,使用init方法,然後保留計數得到由1

遞增,如果你創建它們這樣

NSArray *anarray = [NSArray arrayWithArray:temp]; 

這將創建一個autorelease對象,它會在某個時間後自動釋放。

所以我的建議不使用這種類型的代碼,如果你想使用超過1個功能的對象。總是首先使用init方法來完成工作。

並且如果您確定該程序的其餘部分不需要該對象,而不是使用發佈方法釋放這些對象。

+0

哇...你完全正確...通過添加[[NSMutableArray alloc] initWithArray:...]它完美的工作。謝謝! – 2011-01-10 06:33:56