iOS - AppDelegate作为实例变量?

时间:2012-02-10 16:16:37

标签: objective-c ios uiapplicationdelegate

将AppDelegate作为UIViewController中的实例变量是否可以?与@property (nonatomic, weak) AppDelegate *appDelegate;

一样

为什么我要问是因为我需要经常访问它而不是这样做:

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

[appDelegate doSomething]; 

我能做到:

[appDelegate doSomething]

3 个答案:

答案 0 :(得分:18)

也许可以。

但我最喜欢的解决方案如下。

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/

希望它有所帮助。

答案 1 :(得分:13)

或者你可以做到

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

在UIViewController的子类中 - 然后将其作为所有视图控制器的基类。

然后,[self app]有效,您无需保留参考。

我这样做是为了保留一些常见的简单实用程序 - 您也可以使用类别执行此操作。

答案 2 :(得分:4)

通过完整表达式访问委托与使用(非原子,弱)属性访问委托之间的区别是任意的。当然,如果要经常调用它,可以通过定义属性来保存自己的代码行。

然而,问题提出了一个可能的封装问题的更大问题。最佳做法表明,呼叫沿着层次结构而不是向上。当然,app委托是一个特例,但我的建议仍然是考虑从app委托中隔离你需要的任何资源的可能方法,并将这些引用传递给你的视图控制器层次结构,因为该层次结构是创建