2012-08-05 88 views
1

我有一个使用应用程序委托的类,特别是它有一个NSUserDefaults属性,它正在从我的类中更新。Objective-C创建指向AppDelegate的指针

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

+ (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...],而是说,如果我引用“应用程序”功能,无数次将被实例化的AppDelegate无数次,不是吗?

+0

请参阅[类方法的全局变量](http://stackoverflow.com/questions/8498754/global-variables-for-class-methods/8498798#8498798)了解一些想法。 – 2012-08-05 19:57:55

回答

3

这正是Singleton设计模式的用途,以及为什么Cocoa框架的开发人员可以在应用程序中访问对象的位置使用它,但应该只实例化一次。

+[UIApplication sharedApplication]是一种返回UIApplication类的现有实例的方法。在选择的单词“共享”的使用是一个很好的提示,并the docs for UIApplication清楚地说明它是一个单例:

sharedApplication

返回单一应用实例。

+ (UIApplication *)sharedApplication

这一切都意味着,你可以放心,你是不是实例ň对象,当你把它ñ倍。

+0

啊,我明白了。我倾向于使用静态对象而不是从Objective-C的PHP/Javascript背景来的单例。我甚至没有再看过sharedApplication,出于某种原因,我认为我必须创建UIApplication的单例对象。不管怎样,谢谢。我会阅读文档。 – StuR 2012-08-06 11:31:22

1

你得到的应用程序委托的引用,它投射到您的特定类,你是不是实例与此代码的应用程序的委托,所以不存在内存问题

0

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