Разъяснения о слабых ссылках и сохранении циклов - PullRequest
4 голосов
/ 20 ноября 2011

У меня есть следующий код:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest: request];

operation.completionBlock = ^{
    if([operation hasAcceptableStatusCode]){

    }
};

Кажется, что ARC не нравится [операция hasAcceptableStatusCode], и ​​я получаю следующее предупреждение: «Сильный захват операции» в этом блоке может привести кк циклу сохранения ".

Я не очень опытен в ссылках, есть идеи, как идти сюда?

Спасибо,Шай

1 Ответ

6 голосов
/ 20 ноября 2011

Блоки захватывают (сохраняют) объекты, на которые вы ссылаетесь извне.

операция сохранит завершениеБлок, который сохранит операцию, следовательно, цикл сохранения.

Лучше всего создать слабую ссылку на объект и передать вместо нее

AFHTTPRequestOperation * __weak theOperation = operation

operation.completionBlock = ^{
    if (theOperation) {
        return;
    }
};

Слабые ссылки безопасны во время выполнения, поэтому, если операция была отменена, вы просто отправите сообщение на ноль.

...