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