ARC, блоки и циклы сохранения

Работа над проектом iOS, ориентированным на 4.0 и 5.0, с использованием ARC.

Возникла проблема, связанная с блоками, ARC и ссылкой на объект извне блока. Вот код:

 __block AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
   [operation setCompletionBlock:^ {
       if ([operation isCancelled]) {
           return;
       }

... do stuff ...

operation = nil;
}];

В этом случае компилятор выдает предупреждение о том, что использование «операции» в блоке приведет к циклу сохранения. В ARC __block теперь сохраняет переменную.

Если я добавлю __unsafe_unrehibited, компилятор немедленно освободит объект, поэтому очевидно, что это не сработает.

Я нацелен на 4.0, поэтому я не могу использовать __weak.

Я пробовал сделать что-то вроде этого:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
__block __unsafe_unretained AFHTTPRequestOperation *weakOperation = operation;

, но хотя weakOperation не равен нулю, ни одно из его свойств не заполняется внутри блока.

Как лучше всего справиться с этой ситуацией с учетом перечисленных выше ограничений проекта?

28
задан Hunter 13 October 2011 в 22:15
поделиться