存储导致EXC_BAD_ACCESS错误的排序数组

时间:2011-01-10 06:12:13

标签: objective-c arrays sorting

给定一个基本的键/值数组,我想基于原始数组存储两个已排序的数组:一个数组将按名称排序,另一个数据按年龄排序。

当我将数组输出到日志时,数组似乎正在正确排序;但是,当我尝试在代码中的其他位置访问它们时,我收到了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

有什么想法吗?

更新:感谢@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]];    

1 个答案:

答案 0 :(得分:2)

我不认为你知道这个与否,但是当你用init方法创建一个像字符串或数组或字典这样的对象时,保留计数会增加1

如果你像这样创建它们

NSArray *anarray = [NSArray arrayWithArray:temp];

这将创建一个自动释放对象,该对象将在某个时间后自动释放。

因此,如果您想在多个函数中使用对象,我的建议不要使用这种类型的代码。始终首先使用init方法完成工作。

如果您确定程序其余部分不需要这些对象,那么使用release方法释放它们。