Вместо макроса компилятора (что может привести к неожиданности иногда) я обычно определяю метод класса на моем приложении делегата, как это:
+ (AppDelegate *)sharedDelegate
{
return [[UIApplication sharedApplication] delegate];
}
Тогда, когда мне нужна ссылка на какое-то глобальное состояние, я можно назвать так:
[[[AppDelegate sharedDelegate] managedObjectContext] deleteObject:foo];
Если ваше приложение является достаточно сложным, то может быть стоит проблема прохождения вокруг ссылкой на контекст управляемого объекта, а не с помощью глобальной. Если вы это сделаете, вам будет легче реорганизовать и использовать другие методы позже, например, детские контексты для групповых изменений.
Чтобы быть конкретным, это означает, что каждый контроллер представления имеет собственную переменную экземпляра управляемогоObjectContext. Когда вы представляете новый контроллер представлений, вы передаете ссылку: возможно, в пользовательском методе инициализации, возможно, установив свойство. Ни один из ваших классов (кроме, возможно, контроллера корневого представления) никогда не ссылается на ваш глобальный делегат приложения. Таким образом, если у вас было сложное редактирование, вы могли бы дать ему дочерний контекст, где он мог бы сохранять изменения «временно» (чтобы убедиться, что все объекты действительны); если пользователь нажимает кнопку отмены, вы просто отбрасываете весь контекст.
Кроме того, если вы всегда используете глобальный контекст, у вас могут быть ошибки, которые трудно отследить. Например, вид редактирования, который не очищается после себя, оставляет за собой недопустимый объект. Тогда в следующий раз, когда вы отправитесь спасти что-то несвязанное, вы получите сообщение об ошибке! Случилось со мной, не было весело отлаживать.
Хороший способ представить глобальную переменную ... которая, в свою очередь, вводит скрытые зависимости в ваш код, затрудняет реорганизацию и трудно тестировать изолированно. –
Оба ответа ниже касаются обсуждаемого вопроса о шаблоне дизайна [здесь] (http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html). Хорошо стоит прочитать, когда возникает такой вопрос. – Swizzlr