【问题标题】:Objective-C - Creating pointer to AppDelegateObjective-C - 创建指向 AppDelegate 的指针
【发布时间】:2012-08-05 19:42:53
【问题描述】:

我有一个使用应用程序委托的类,特别是它有一个 NSUserDefaults 属性,该属性正在从我的类中更新。

在我的身份验证类实现文件中,我有:

+ (BOOL) checkUserDefaults {
    AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];

    if([appDelegate.session objectForKey:@"UserID"] != nil) {
        return TRUE;
    } else {
        return FALSE;
    }
}

+ (void) syncUserDefaults : (NSString *) UserID {
    AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
    [appDelegate.session setObject:UserID forKey:@"UserID"];
    [appDelegate.session synchronize];
}

我将如何存储这行代码:

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

作为一个全局的(对于这个类),所以我可以写例如 [app.session setObject...]?

我可以做一个函数:

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

然后做[[self app].session setObject...],但如果我多次引用“app”函数,那将多次实例化 AppDelegate,不是吗?

【问题讨论】:

标签: objective-c pointers delegates


【解决方案1】:

这正是 Singleton 设计模式的用途,也是 Cocoa 框架的开发人员在可能跨应用访问对象但只应实例化一次的地方使用它的原因。

+[UIApplication sharedApplication] 是一个返回UIApplication 类的现有 实例的方法。在选择器中使用“共享”这个词是一个很好的提示,the docs for UIApplication 明确声明它是一个单例:

sharedApplication

返回单例应用程序实例。

+ (UIApplication *)sharedApplication

这一切都意味着您可以放心,当您调用它 n 次时,您不会实例化 n 个对象。

【讨论】:

  • 啊,我明白了。我倾向于使用静态对象,而不是从 PHP / Javascript 背景到 Objective-C 的单例。我什至没有看一眼 sharedApplication,出于某种原因,我认为我必须创建 UIApplication 的单例对象。不管怎样,谢谢。我会阅读文档。
【解决方案2】:

您正在获取对应用程序委托的引用并将其转换为您的特定类,您没有使用此代码实例化应用程序委托,因此不存在内存问题

【讨论】:

    【解决方案3】:

    不,您的 app 方法不会创建任何对象,它只是找到一个全局对象并返回指向其属性的指针。

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      相关资源
      最近更新 更多