给定一个基本的键/值数组,我想基于原始数组存储两个已排序的数组:一个数组将按名称排序,另一个数据按年龄排序。
当我将数组输出到日志时,数组似乎正在正确排序;但是,当我尝试在代码中的其他位置访问它们时,我收到了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]];
答案 0 :(得分:2)
我不认为你知道这个与否,但是当你用init方法创建一个像字符串或数组或字典这样的对象时,保留计数会增加1
如果你像这样创建它们
NSArray *anarray = [NSArray arrayWithArray:temp];
这将创建一个自动释放对象,该对象将在某个时间后自动释放。
因此,如果您想在多个函数中使用对象,我的建议不要使用这种类型的代码。始终首先使用init方法完成工作。
如果您确定程序其余部分不需要这些对象,那么使用release方法释放它们。