Хранение отсортированных массивов, вызывающих ошибку EXC_BAD_ACCESS - PullRequest
1 голос
/ 10 января 2011

Учитывая базовый массив ключ / значение, я хочу сохранить два отсортированных массива на основе исходного массива: один массив будет отсортирован по имени, а другой по возрасту.

Массивы, кажется, сортируются правильно, когда я выводю их в журнал; однако, когда я пытаюсь получить доступ к ним в другом месте кода, я получаю ошибку 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 Ответ

2 голосов
/ 10 января 2011

Я не думаю, что вы знаете об этом или нет, но когда бы вы ни создавали объект, такой как строка, массив или словарь, с помощью методов init, то количество сохранений увеличивается на 1

, и если вы создаете их так

NSArray *anarray = [NSArray arrayWithArray:temp];

это создаст объекты автоматического выпуска, которые через некоторое время будут автоматически освобождены.

Поэтому мой совет не используйте этот тип кода, если вы хотите использовать объекты более чем1 функция.Всегда используйте сначала методы init, чтобы выполнить работу.

, и если вы уверены, что объекты не нужны для остальной части программы, отпустите их, используя метод release.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...