IOS - AppDelegate как переменная экземпляра?

Можно ли использовать AppDelegate как переменную экземпляра в UIViewController? Как @property (nonatomic, weak) AppDelegate *appDelegate;

Почему я спрашиваю, потому что мне нужно получить к нему доступ довольно часто, а не делать:

AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

[appDelegate doSomething]; 

Я мог бы сделать:

[appDelegate doSomething]

Ответ 1

Или вы могли бы сделать

-(YourAppDelegate*) app
{
   return (YourAppDelegate*) [[UIApplication sharedApplication] delegate];
}

В подклассе UIViewController - сделайте это базовым классом всех ваших контроллеров представлений.

Затем [self app] работает, и вам не нужно сохранять ссылку.

Я делаю это, чтобы сохранить некоторые простые простые утилиты там - вы также можете сделать это с категорией.

Ответ 2

Может быть, все в порядке.

Но мое любимое решение следующее.

В AppDelegate.h

+ (AppDelegate *)appDelegate;

В AppDelegate.m

+ (AppDelegate *)appDelegate
{
    return (AppDelegate *)[[UIApplication sharedApplication] delegate];
}

Затем используйте везде, где хотите:

AppDelegate* sharedDelegate = [AppDelegate appDelegate];

Некоторые примечания:

если вы используете AppDelegate для общих данных, вы можете читать singletons-appdelegates-and-top-level.html.

если вы используете AppDelegate для своего рабочего процесса логических приложений, вы можете читать handling-your-initial-view-controllers-for-iphone/

Надеюсь, что это поможет.

Ответ 3

Различие между доступом к делегату посредством полного выражения в сравнении с (неатомным, слабым) свойством произвольно. Конечно, сохраните себе строки кода, указав свойство, если вы собираетесь его часто называть.

Однако возникает вопрос о большей проблеме возможной проблемы инкапсуляции. Лучшая практика предполагает, что призывы идут вниз по иерархии против вверх. Конечно, делегат приложения - это особый случай, но все же мой совет должен был рассмотреть возможные способы выделения любого ресурса, который вам нужен из делегата приложения, и передать эти ссылки вниз по иерархии диспетчера представлений, поскольку эта иерархия создан.