Помогите с NSFetchedResultsController - PullRequest
2 голосов
/ 16 февраля 2010

Пожалуйста, помогите с этой проблемой использования NSFetchedResultsController.

Я создал объект NSFetchedResultsController и использую его один раз в методе: tableView:cellForRowAtIndexPath: и когда я пытаюсь выполнить тот же код в методе tableView:didSelectRowAtIndexPath:, я получаю EXC_BAD_ACCESS.

Вот код из 2 методов

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    Person *person = [fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = person.name; //This works fine

    [person release];

    return cell;
}

и вот проблемный фрагмент:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    PhotoListViewController *photoListViewController = [[PhotoListViewController alloc] initWithNibName:@"PhotoListViewController" bundle:nil];

    //The next line returns a bad object or undefined memory
    Person *person = [fetchedResultsController objectAtIndexPath:indexPath];
    //causing the call of [person name] to return EXC_BAD_ACCESS
    photoListViewController.person = [person name];
    [self.navigationController pushViewController:photoListViewController animated:YES];

    [photoListViewController release];
    [person release];
}

Пожалуйста, помогите мне понять, почему код там ломается. Ценю любые предложения.

Ответы [ 2 ]

3 голосов
/ 16 февраля 2010
Person *person = [fetchedResultsController objectAtIndexPath:indexPath]; 
cell.textLabel.text = person.name; //This works fine
[person release];

[person release] - проблема - нет необходимости освобождать человека, если он там не размещен. Это приводит к перевыпуску person, что приводит к падению, когда кто-то пытается получить к нему доступ.

1 голос
/ 25 июня 2010

Несмотря на то, что в этом примере можно манипулировать автоматически выпущенным объектом (из-за простоты манипуляций, то есть вы просто захватываете одно свойство * person), правильным способом будет сохранить ваш объект Person и освободить его в конце:

Person *person = [[fetchedResultsController objectAtIndexPath:indexPath] retain];
// bla bla
[person release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...