2011-01-10 11 views
1

基本的なキーと値の配列を指定すると、元の配列に基づいてソートされた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]];  

答えて

2

私はあなたがこのことについてか知っていると思うけど、これまであなたがオブジェクトを作成するときにいけませんその後のinitメソッドで文字列や配列や辞書、のような保持カウントは1

インクリメントしますと、あなたはこの

NSArray *anarray = [NSArray arrayWithArray:temp]; 
のようにそれらを作成した場合0

これはいつか自動的に解放される自動リリースオブジェクトを作成します。

2つ以上の関数でオブジェクトを使用する場合は、このタイプのコードを使用しないでください。まず、initメソッドを使用して作業を完了させてください。

となり、オブジェクトがreleaseメソッドを使用して解放されるよりもプログラムの残りの部分で必要でないことが確かな場合は、

+0

うわー...あなたはまさにそうです... [[NSMutableArray alloc] initWithArray:...]を追加することによって完璧に動作します。ありがとう! –

+0

ちょうど一般的に、ロビンが言ったことに加えて、オートリリースは *常に*答えではありません。 retain/release/autoreleaseのトピックを読んでください。 [NSArray arrayWithArray:temp]がautoreleaseオブジェクトを作成するだけでなく、割り当て/初期化していないため、解放する必要はありません。したがって、あなたはNSArrayが推論できます。 – jakev

+0

私は明示的にnameArrayとageArrayを割り当てているので、私はそれらを解放する責任があります。それが問題なのです。 –

関連する問題