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