ARC, Core Data и многопоточность, ARC освобождает объекты - PullRequest
1 голос
/ 26 февраля 2012

Как заставить ARC не освобождать объекты в основном потоке, которые используются в другом потоке? Как предотвратить выпуск?

-(void)someFunc
{
    array = ... //fetching array of entities from a core data
    for(SomeObject * obj in array)
    {
         NSSomeOperation * op = [[NSSomeOperation alloc] initWithValue:obj];
         //start operation
    }
    //it seems here ARC release array and all items  
}

Массив извлекается из базовых данных.

Ответы [ 4 ]

2 голосов
/ 14 июня 2012

У меня та же проблема с ARC и получением результатов с помощью FetchResultController. Сначала я загружаю записи, а затем добавляю им tableView, вначале все идет хорошо но когда я прокручиваю или выбираю любую строку, управляемые объекты внутри массива становятся равными "nil".

Причина в том, что я забыл небольшой __strong для создаваемого мной объекта, который содержит всю нужную мне базовую выборку.

1 голос
/ 26 февраля 2012

Вместо того, чтобы возиться с сохранением строгой ссылки на массив и оценкой каждого элемента с помощью NSOperation, вы можете получить аналогичное параллельное перечисление, используя блоки:

-(void)someFunc
{
    array = ... //get array from another function
    [array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        // Perform the operation on each obj in this block
        // The blocks will run concurrently
    }
}
1 голос
/ 26 февраля 2012

В вашем NSSomeOperation.

должна быть четкая ссылка на этот объект.

Если вы используете свойство:

@property (nonatomic, strong) SomeObject *value;

Если вы используете ивар:

__strong SomeObject *value;

Посмотрите на переход руководство для ARC .

0 голосов
/ 26 февраля 2012

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

...