Взять в собственность объекты авто-релиза с помощью команды retain? - PullRequest
0 голосов
/ 22 марта 2012

Как правильно подходить к следующему.Чтобы получить список с объектами CoreData, у меня есть «менеджер данных», в котором я создаю NSFetchResultController, выполняю поиск и получаю NSFetchResultsController с объектами.

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

Что я делаю, это создаю FetchedResultController вDataManager и автоматически выпустить его.В TableViewController я сохраняю его (при условии, что он вступит во владение им).

    NSFetchedResultsController* objects = [[delegate dataManager] getMenu:parentMenu];        
    _objects = [objects retain];

Это вызывает DataManager:

- (NSFetchedResultsController*) getMenu:(DOMenuItem*) parentMenu {
    NSPredicate* predicate;
    if(parentMenu == nil){
        predicate = [NSPredicate predicateWithFormat:@"(parent == NULL)", parentMenu];
    } else {     
        predicate = [NSPredicate predicateWithFormat:@"(parent == %@)", parentMenu];    
    }

    [NSFetchedResultsController deleteCacheWithName:_cacheName];

    NSFetchedResultsController* aFetchedResultsController = [self createFetchedResultsController];    
    [aFetchedResultsController.fetchRequest setPredicate:predicate];
    [aFetchedResultsController.fetchRequest setFetchLimit:0];

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:_defaultSortField ascending:YES] autorelease];
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];

    [aFetchedResultsController.fetchRequest setSortDescriptors:sortDescriptors];        

    // Fetch the records and handle an error
    NSError *fetchError;

    if (![aFetchedResultsController performFetch:&fetchError]) {
        // Handle the error.
        // This is a serious error and should advise the user to restart the application
        NSLog(@"Fetching data error: %@", [fetchError localizedDescription]);
    }

    return aFetchedResultsController;    
} 

- (NSFetchedResultsController *) createFetchedResultsController {     
    NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
    NSEntityDescription *entity = [NSEntityDescription entityForName:_objectName inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:_defaultSortField ascending:NO] autorelease];
    NSArray *sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:_sectionNameKeyPath cacheName:_cacheName];

    return [aFetchedResultsController autorelease];
} 

Однако я работаю в ситуациях, когда я получаюошибка Dealloc на этом FetchedResultController при вызове на линии.

if(indexPath.section == [[_objects sections] count] + 1){

Сообщение:

* - [секции NSFetchedResultsController]: сообщение отправлено освобожденному экземпляру 0xe3de1b0

Что-то не так с этим методом?Если это так, то какой способ передачи собственности был бы предпочтительным для передачи класса из класса создания в класс, который должен его сохранить.

Редактировать: Когда я возвращаю 'retain' вместо 'autorelease' при возвратеfetchedResultsController, тогда все это работает нормально, но это не кажется надлежащей практикой кодирования, так как «владелец» не освобождает объект.Я не думаю, что «копировать» или так работает с ManagedObjects или делает это?

1 Ответ

0 голосов
/ 22 марта 2012

Правильный способ в среде, не являющейся ARC, состоит в том, чтобы возвращать объект автоматически освобожденным, а затем, если использование объекта будет сохраняться за рамками принимающей процедуры (и, рекурсивно, процедуры, которая ее вызывала, до ближайшей границы автоматического выпуска), объект должен быть сохранен с предоставлением положения (обычно в методе dealloc "владеющего" объекта) для освобождения сохранения на основе 1-к-1.

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

...