сбой деаллока на сохраненном массиве.Программа получила сигнал: «EXC_BAD_ACCESS» - PullRequest
0 голосов
/ 27 мая 2011

Я застрял в аварийном отказе EXC_BAD_ACCESS ”в моем освобождении контроллера табличного представления. Сбой происходит при освобождении NSMutableArray, которому было присвоено свойство сохранения. У меня есть второй NSMutableArray, которому также было присвоено свойство retain, но его выпуск не вызывает сбой. Пожалуйста, взгляните на следующий код, чтобы увидеть, не обращаю ли я внимания на управление памятью. Спасибо.

В моем заголовочном файле у меня есть следующее:

@interface selectSourcesTableViewController : UIViewController  <UITableViewDelegate, UITableViewDataSource> {
    NSMutableArray *selectedNames;
    NSMutableArray *selectedAvailability;
}

@property (retain, nonatomic)   NSMutableArray  *selectedNames;
@property (retain, nonatomic)   NSMutableArray  *selectedAvailability;

В моей реализации у меня есть следующее:

@implementation selectSourcesTableViewController
@synthesize selectedNames;
@synthesize selectedAvailability;

- (void)viewDidLoad {

    NSArray *names = [selectedSourceFileContent objectForKey:@"selectedNames"];
    selectedNames = [[NSMutableArray alloc] initWithObjects: nil];

    NSArray *availability = [selectedSourceFileContent objectForKey:@"selectedAvailability"];
    selectedAvailability = [[NSMutableArray alloc] initWithObjects: nil];

    for (int i=0; i < [names count]; i++) {
        NSString *aName = [names objectAtIndex:i];
        [selectedNames addObject: aName];
        NSString *anAvailability = [availability objectAtIndex:i];
        [selectedAvailability addObject: anAvailability];
    }
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: kCellIdentifier];

...

    for (int i=0; i < [selectedNames count]; i++) {
        if ([contentForThisRow isEqualToString:[selectedNames objectAtIndex:i]]) {
            cell.accessoryType = UITableViewCellAccessoryCheckmark;
        }
    }
}

- (void)dealloc {
    [super dealloc];
    [selectedNames release];
    [selectedAvailability release];
}

Код, показанный выше, показывает единственное использование этих двух массивов.

Итак, ничего плохого не происходит, когда selectedNames выпущен, но я получаю сбой EXC_BAD_ACCESS, когда selectedAvailability выпущен.

Последнее замечание. Там не происходит сбой в самый первый раз, когда я запускаю этот код после запуска xcode. После этого происходит сбой каждый раз, когда я перезапускаю приложение.

Есть мысли?

1 Ответ

6 голосов
/ 27 мая 2011
[super dealloc]

нужно вызывать последним, а не первым, в вашем собственном методе dealloc.

...