Отмена выделения объекта в фоновом потоке - PullRequest
1 голос
/ 31 января 2012

Я работал над проектом iOS, который использовал загрузку данных в фоновом режиме. Что ж, честно скажу - реализация была не самой лучшей (и была изменена позже, чтобы убрать такой неочевидный шаблон), и у меня возникли некоторые проблемы с неотменяемыми объектами, и я не могу сказать, что документы дали мне четкое понимание о том, что происходит. Код, демонстрирующий общую идею:

- (void)loadModelAtIndex:(NSUInteger)index {
    Model *model = [self modelAtIndex:index];
    if (model) {
        model.index = index;
        [self performSelectorInBackgroundThread:@selector(loadModelInBackgroundThread) withObject:model]
    }
}

- (void)loadModelInBackgroundThread:(Model *)model {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    model.data = [NSData dataWithContentsOfURL:model.url];
    //and some other changes can be here
    [self performSelectorOnMainThread:@selector(modelDidLoad) withObject:model waitUntilDone:NO]'
    [pool drain];
}

- (void)modelDidLoad:(Model *)model {
    [self saveModel:model atIndex:model.index];
    [self loadModelAtIndex:model.index + 1];
}

Ну, почти все время это работало, как ожидалось. За исключением случаев, когда вызывающий абонент был освобожден при загрузке в фоновом режиме - объект модели остался в памяти, но не был освобожден (в этот момент у меня растет память).

Может кто-нибудь объяснить мне, что произойдет в случае освобождения, пока работает фоновый поток? Я не уверен, что этот код может подойти вообще, но все же заинтересован. Любая модификация заставит вещи работать хорошо?

1 Ответ

2 голосов
/ 31 января 2012

За исключением случаев, когда вызывающий объект был освобожден при загрузке в фоновом режиме - объект модели остался в памяти

вызовы performSelector | …Thread… сохраняют свои аргументы.Если ваши объекты были освобождены в это время, проблема кроется в другом.Бегите с включенными зомби, чтобы найти его - вы можете записать каждый счетчик ссылок.

...