Каков рекомендуемый шаблон для следующего сценария GCD / блоков? - PullRequest
2 голосов
/ 09 мая 2011

У меня вопрос по поводу Grand Central Dispatch, блоков и управления памятью.Рассмотрим этот код:

Worker *myWorker = [[Worker alloc] init];
[work doAsyncStuffWithBlock:^(NSMutableDictionary *info)
{
    NSLog(@"processing info results");
}];
[myWorker release];

Здесь я хочу, чтобы doAsyncStuffWithBlock происходил асинхронно, а затем выполнял блок, когда он дает некоторые результаты.Между тем этот основной код будет продолжаться.Здесь безопасно выпустить myWorker?Будет ли внутренняя диспетчеризация dispatch_queue сохранять ссылку на нее, чтобы в конечном итоге выполнить этот блок?Или я должен выпустить его внутри блока?это кажется страннымСпасибо за любые предложения.

Ответы [ 2 ]

4 голосов
/ 10 мая 2011

Когда блок ссылается на объект Objective-C, например:

Worker *myWorker = [[Worker alloc] init];
[work doAsyncStuffWithBlock:^(NSMutableDictionary *info)
{
    NSLog(@"processing info results");
    [myWorker doSomething];
}];
[myWorker release];

автоматически сохраняет этот объект и, когда блок освобождается, автоматически освобождает этот объект.

Так что да, вы должны выпустить myWorker в своем коде, и нет, вы не должны выпускать myWorker внутри блока.

1 голос
/ 10 мая 2011

Читать

Вы можете освободить за пределами блока.

...