1

我有一个使用应用程序委托的类,特别是它有一个 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,不是吗?

4

3 回答 3

3

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

+[UIApplication sharedApplication]是一种返回类的现有实例的方法UIApplication。在选择器中使用“共享”这个词是一个很好的提示,并且文档UIApplication清楚地表明它是一个单例:

共享应用程序

返回单例应用程序实例。

+ (UIApplication *)sharedApplication

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

于 2012-08-05T19:51:13.847 回答
1

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

于 2012-08-05T19:46:18.310 回答
0

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

于 2012-08-05T19:46:56.627 回答