Это безопасно?Возможно сохранение цикла на синглтоне как «я» в блоке - PullRequest
1 голос
/ 27 декабря 2011

Я уверен, что это на 100% безопасно, но я не хочу ничего пропустить. У меня есть следующий код

- (void) scheduleControlSurfaceProcess {
    [self.operationQueueForMessageProcessing addOperationWithBlock:^{
        // do something
        [self scheduleControlSurfaceProcess];     
    }];
}

, где я - это Синглтон. Блок прекрасно работает как не основной поток. Я не вижу проблем с памятью в профилировщике (которому я не очень доверяю).

Итак, могу я проигнорировать предупреждение: «Блок будет удерживаться объектом, сильно удерживаемым захваченным объектом?» Если нет, то как я могу настаивать на том, чтобы блок был освобожден (с ARC) ? Получить предупреждение об удалении достаточно легко, но назначение id what = self кажется, что это не решит проблему.

РЕДАКТИРОВАТЬ : как я понял довольно поздно в этом вопросе, реальная проблема здесь заключалась в том, что я перенесен изнутри самого блока. Это, очевидно, проблематично, потому что каждый блок сохраняет следующий.

ПРИМЕЧАНИЕ: Я знаю, что много вопросов по этой теме , но я не достаточно опытен, чтобы знать, какие ситуации, если таковые имеются, похожи на эту .

1 Ответ

5 голосов
/ 27 декабря 2011
- (void) scheduleControlSurfaceProcess {
    __weak id SELF = self;
    [self.operationQueueForMessageProcessing addOperationWithBlock:^{
        id strongSelf = SELF; //Guarantee self doesn't go away in the meantime
        // do something
        [self.operationQueueForMessageProcessing addOperationWithBlock:^{
            [strongSelf scheduleControlSurfaceProcess]; 
        }];
    }];
}

Это гарантировало бы, что у вас здесь не будет цикла. Предупреждение является полностью действительным, self сохраняет очередь операций, очередь сохраняет блок, блок сохраняет себя. И снова и снова мы идем.

В моем модифицированном примере блок захватит SELF и сохранит его в 'strongSelf'. Шаг strongSelf не является строго обязательным, но он гарантирует, что ссылка на себя не обнулится во время выполнения блока.

...