Как освободить объект с обработчиком завершения блока в ARC?

Это обычный паттерн в моем коде - выделить объект, дать ему сделать что-то с обработчиком завершения и освободить его в обработчике:

LongOperation *foo = [[LongOperation alloc] init];
[foo runWithCompletion:^{
    // run some code and then:
    [foo autorelease];
}];

Это работает довольно хорошо, но когда я пытаюсь преобразовать код в ARC, Xcode справедливо жалуется, что он не может просто убрать autorelease из блока, поскольку это заставит объект foo деаллоцироваться после выхода из области видимости.

Итак, какой хороший способ написать подобный паттерн в ARC? Я мог бы ввести переменную экземпляра для foo:

[self setFoo:[[LongOperation alloc] init]];
[foo runWithCompletion:^{
    // run some code and then:
    [self setFoo:nil];
}];

... но код уже не будет реентерабельным.

9
задан zoul 3 January 2012 в 21:17
поделиться