【问题标题】:iOS – AppDelegate as instance variable?iOS – AppDelegate 作为实例变量?
【发布时间】:2012-03-03 02:37:18
【问题描述】:

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

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

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

[appDelegate doSomething]; 

我能做到:

[appDelegate doSomething]

【问题讨论】:

  • 如果你经常访问它,为什么不把它移到别处呢?

标签: objective-c ios uiapplicationdelegate


【解决方案1】:

也许没问题。

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

在你的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/

希望对你有帮助。

【讨论】:

  • getAppDelegate 违反了 Apple 的 naming guidelines。更好的名字是+ (AppDelegate *)appDelegate;+ (AppDelegate *)sharedAppDelegate;
【解决方案2】:

或者你可以这样做

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

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

然后,[self app] 有效,您不必保留引用。

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

【讨论】:

    【解决方案3】:

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

    然而,这个问题提出了一个更大的问题,即可能的封装问题。最佳实践建议调用在层次结构中向下而不是向上。当然,应用程序委托是一个特例,但是,我的建议仍然是考虑将您需要的任何资源与应用程序委托隔离的可能方法,并将这些引用传递到您的视图控制器层次结构中,因为该层次结构是已创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      相关资源
      最近更新 更多