Проблемы с памятью с -performSelector:onThread:withObject:waitUntilDone:

Проходя NSDictionary буквально как объект -performSelector:onThread:withObject:waitUntilDone: приведет к сбою, так как autoreleasepool цикла выполнения другого потока попытается освободить его.

Как лучше всего решить эту проблему? Просто сохраните объект или есть лучшая практика?

(Само собой разумеется, что этот проект не использует ARC.)

1 ответ

В словарь не будет добавлен пул автоматического выпуска других потоков, если вы явно не вызовете [dictionary autorelease] в этой теме.

Вероятно, это пул автоматического выпуска исходного потока, который освобождает объект. Когда вы создаете NSDictionary экземпляр, использующий буквальный синтаксис, автоматически освобождается (+[NSDictionarydictionaryWithObjects:forKeys:count:] называется под капотом).

Старая документация NSObject, которую я нашел, говорит (о performSelector:onThread:withObject:waitUntilDone:)

Этот метод сохраняет приемник и параметр arg до тех пор, пока не будет выполнен селектор

Таким образом, вы должны переиздать словарь где-то.

Я бы использовал Grand Central Dispatch вместо performSelector методы. Блоки неявно сохраняют переменные, которые они захватывают, поэтому в большинстве случаев вам не нужно беспокоиться об управлении памятью:

NSDictionary *dictionary = @{@"foo" : @"bar"};
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //do something with the dictionary
    [dictionary description];
    //if needed, do something on main thread once the background work is finished
    dispatch_sync(dispatch_get_main_queue(), ^{
      //...
    });
  });
Другие вопросы по тегам