2012-08-05 97 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

不,你的應用方法不創建任何對象,它只是找到一個全局對象,並返回一個指向它的屬性的指針。