2015-07-21 2 views
1

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

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

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

ответ

0

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

Возможно, это оригинальный пул автореферата ниток, который освобождает объект. Когда вы создаете экземпляр NSDictionary с использованием литерала, он автореализован (+[NSDictionarydictionaryWithObjects:forKeys:count:]is called under the hood).

old NSObject documentation я нашел говорит (о 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(), ^{ 
     //... 
    }); 
    }); 
Смежные вопросы