【问题标题】:Trying to Access Application Delegate Variables / Properties尝试访问应用程序委托变量/属性
【发布时间】:2009-08-27 20:02:56
【问题描述】:

我正在使用我的应用程序委托的变量/属性作为全局变量。 (我不想处理单例类。)

我正在尝试在我的 Application Delegate 类中编写 #define 语句。如果我输入:

  [UIApplication sharedApplication]

在我的应用委托类中,代码提示无法识别 sharedApplication。但是,如果我在 viewController 类中键入相同的内容,“sharedApplication”会立即弹出。

为了在我的 applicationDelegate.h(或 .m?)中定义一个 NSMutableDictionary,我写:

#define MyDictionary [[[UIApplication sharedApplication] delegate] stateDictionary]

如果我尝试在另一个类中使用它:

[[MyDictionary objectForKey:@"California"] largestCity];

我收到必须首先声明 MyDictionary 的错误。我真的对这里的很多概念感到困惑。

【问题讨论】:

    标签: objective-c delegates global-variables


    【解决方案1】:

    我很确定有人会更好地回答这个问题,但这里有一个快速的:

    假设您的应用程序名为 myApplication。将“全局”属性分配给 MyApplicationDelegate,然后可以从任何地方访问它,如下所示:

    // get reference to app delegate
    MyApplicationDelegate *appDelegate = (MyApplicationDelegate *)[[UIApplication sharedApplication] delegate]
    
    Property *myProperty = appDelegate.property;
    

    另外,请确保您在标题中链接到 MyApplicationDelegate 文件:

    #import "MyApplicationDelegate.h"
    

    一般来说,使用“全局”对象是否是好的设计还有更长的争论,但我现在不会讨论这个问题。

    【讨论】:

    • 效果很好。谢谢你。无论如何要定义它,这样我就可以在不使用您的 2 个语句的情况下访问该变量?我必须释放它们吗?如果我确实释放了它们,它们会释放我的字典和委托的 AppDelegates 实例吗?
    • 另外,在我的问题的第一部分,这两个 appDelegate 有什么区别?
    • 不幸的是,您必须使用这两行代码。我知道没有真正的全局变量,但是我又不在我的代码中使用它们。 :) 发布:在您创建它们的类中发布它们。例如,如果您在 MyApplicationDelegate 中创建它们,则在该处的 dealloc 方法中释放它们。应用程序委托问题:开始一个新的 stackoverflow 问题。 :) 这是它自己的话题......
    【解决方案2】:

    我总是向UIApplication 添加一个类别,例如:

    @interface UIApplication (MyAppDelegate)
    +(MyAppDelegate*)sharedMyAppDelegate;
    @end
    

    这样我就完全不用担心类型转换了。我经常在与MyAppDelegate 类本身相同的文件中定义和实现这个类别。所以这是我#import 的标题。您可以将其添加到您的 MyProject_Prefix.chp 文件中。

    如果你的架构是正确分层的,单件也不错(是的,它是完全可测试的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      相关资源
      最近更新 更多