基本的なキーと値の配列を指定すると、元の配列に基づいてソートされた2つの配列を格納したいと考えています。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]];
うわー...あなたはまさにそうです... [[NSMutableArray alloc] initWithArray:...]を追加することによって完璧に動作します。ありがとう! –
ちょうど一般的に、ロビンが言ったことに加えて、オートリリースは *常に*答えではありません。 retain/release/autoreleaseのトピックを読んでください。 [NSArray arrayWithArray:temp]がautoreleaseオブジェクトを作成するだけでなく、割り当て/初期化していないため、解放する必要はありません。したがって、あなたはNSArrayが推論できます。 – jakev
私は明示的にnameArrayとageArrayを割り当てているので、私はそれらを解放する責任があります。それが問題なのです。 –