Как правильно адресовать "Слабый приемник может быть непредсказуемо нулевым в режиме ARC" - программирование

Как правильно адресовать "Слабый приемник может быть непредсказуемо нулевым в режиме ARC"

Я включил новый флаг в xcode и получил предупреждение "Слабый приемник может быть непредсказуемо нулевым в режиме ARC". Это меня смущает, потому что из-за КУРСА это может быть ноль.

4b9b3361

Ответ 1

Я задал этот вопрос неделю назад и не получил ответа, но Грег Паркер ответил на него в списке рассылки. Поэтому я отвечаю за ответ.

Мы добавили это предупреждение, потому что на практике мы видели множество тонких и трудно отлаживаемых проблем.

Рекомендуемая практика состоит в том, чтобы прочитать слабую переменную в сильную локальную переменную один раз, а затем использовать локальную переменную.

  • Грег Паркер

В моем первом воплощении этого вопроса я опубликовал что-то вроде этого, где я думал, что тестирование на nil должно быть достаточно

if (self.rootViewController) {
    [self.rootViewController controllerWillChangeContent:controller];
}

Проблема заключается в том, что self.rootViewController мог бы стать nill в пространстве между проверкой на nil и завершением вызванного метода. Нам говорят, что нужно назначить сильную локальную ссылку и использовать ее так

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
    RootViewController *rootVC = self.rootViewController;
    if (rootVC) {
        [rootVC controllerWillChangeContent:controller];
    }
}

Стивен Батлер представил краткую переформулировку проблемы, это предупреждение предназначено для борьбы с

То, что мы пытаемся предотвратить, - это исключить экземпляр объекта в то время как вы находитесь в [someMethod], потому что вы вызвали это из-за слабого и ничего не удерживается на объекте.