NSArray вызывает EXC_BAD_ACCESS - PullRequest
       1

NSArray вызывает EXC_BAD_ACCESS

2 голосов
/ 06 февраля 2011

У меня проблема с использованием NSArray для заполнения UITableView.Я уверен, что делаю что-то глупое, но я не могу понять это.Когда я пытаюсь сделать простой подсчет, я получаю EXC_BAD_ACCESS, который я знаю, потому что я пытаюсь читать из памяти, которая не существует.

Мой .h файл имеет это:

@interface AnalysisViewController : UITableViewController 
{
StatsData *statsData;
NSArray *SectionCellLabels;
}

Мой .m имеет это:

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSLog(@"AnalysisViewController:viewWillAppear");

// Step 1 - Create the labels array
SectionCellLabels = [NSArray arrayWithObjects:@"analysis 1",
                     @"analysis 2",
                     @"analysis 3", nil];
}


- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"AnalysisViewController:cellForRowAtIndexPath");

// Check for reusable cell first, use that if it exists
UITableViewCell *cell = [tableView    
              dequeueReusableCellWithIdentifier:@"UITableViewCell"];

// If there is no reusable cell of this type, create a new one
if (!cell) {
    cell = [[[UITableViewCell alloc]
             initWithStyle:UITableViewCellStyleDefault
             reuseIdentifier:@"UITableViewCell"] autorelease];
}

    /******* The line of code below causes the EXC_BAD_ACCESS error *********/
NSLog(@"%d",[SectionCellLabels count]);

return cell;
}

Любая помощь с благодарностью.

Майк

Ответы [ 2 ]

8 голосов
/ 06 февраля 2011

Проблема здесь:

SectionCellLabels = [NSArray arrayWithObjects:@"analysis 1",
                     @"analysis 2",
                     @"analysis 3", nil];

Ваш массив автоматически освобожден, поэтому в конце метода он, вероятно, больше не доступен.

Чтобы это исправить, просто добавьте сообщение retain, например:

SectionCellLabels = [[NSArray arrayWithObjects:..., nil] retain];

И обязательно release массив в другом месте, как ваш dealloc метод.

Еще один совет, вы можете использовать имена с первым символом в нижнем регистре, чтобы они не были классами. Вы даже можете заметить, что это запутанное выделение StackOverflow.

1 голос
/ 06 февраля 2011

Попробуйте это

SectionCellLabels = [[NSArray arrayWithObjects:@"analysis 1",
                     @"analysis 2",
                     @"analysis 3", nil] retain];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...