Это обычный паттерн в моем коде - выделить объект, дать ему сделать что-то с обработчиком завершения и освободить его в обработчике:
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];
}];
... но код уже не будет реентерабельным.