2013-08-01 67 views
3

我記得在我的學習階段的某個特定時間,實現了iOS中'全局'變量的概念,可以在任何類的整個應用程序。我通過Matt Galloway閱讀了很多很好的教程,例如這個。關於iOS中全局變量的替代方法(使用類方法和變量)

我剛剛完成了我終於實現的代碼,我意識到我已經以非常不同的方式完成了這些教程。我想知道我收養

我的.h文件是類似的方法可能帶來的弊病/優點:

@interface GlobalVariables : NSObject 

+(void)setUsername:(NSString *)string; 
+(NSString *)getUsername; 

@end 

和我的M檔是:

static NSString *name; 

@implementation GlobalVariables 

+(void)setUsername:(NSString *)string{ 
    name = string; 
} 
+(NSString *)getUsername{ 
    return name; 
} 

@end 

我設置全球變量在任何其他類像

[GlobalVariables setUsername:@"user1"]; 

並得到它在其他類

self.nameLabel.text = [GlobalVariables getUsername]; 

對於我所做的是否有任何錯誤/正確?任何意見的正確方向將不勝感激。謝謝:)

+0

如果你要實現的東西,你在這裏描述,你會(IMO)更好關閉使你的數據成爲一個單例的實例變量(通常包括單個靜態指向該單例)。這個觀點被說明了,你的方法沒有任何問題。 – mah

+0

如果您製作了應用程序代理的這些屬性,該怎麼辦?這可以與@mah建議的單例實例完美協作。 –

+0

@mah,我想我的方法的推理是,讓他們作爲實例變量會導致每次需要訪問變量時都需要實例化類。如果我的方法本身沒有任何問題,那麼我認爲緊湊性可能是我當時看到的一個優點:)感謝您的意見! – Sachin

回答

2

你在做什麼是臭的,但你是如何做的是精(幾乎是 - 見下文)...

基本上有你需要存儲全局狀態不可避免的情況下...

你應該嘗試的努力,你可以避開他們......這裏是我的隨筆:

如果要保持狀態是真正的全球性和不經常訪問的,然後將它們存儲在使用NSUserDefaults用戶的默認值:

[[NSUserDefaults standardUserDefaults] setObject:@"123456789" forKey:@"apiKey"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

如果你的狀態不是真正的「全球性」,那麼你應該嘗試找到正確的情況下,即使它是一個人造的:

@interface EncryptionContext: NSObject 
    @property int someProperty 
@end 

你在做什麼是好的,我也喜歡一個單身...基本上任何你可以用一個單你可以在多線程應用程序與+[Class classMethod]甚至nakedCFunction()

做可以肯定,使他們始終保持一致的狀態,以@synchronize您的存取和setter。

在引用計數的代碼,你會想保留新的對象並釋放舊的......

static NSString *name; 

@implementation GlobalVariables 

+(void)setUsername:(NSString *)string{ 

    id tmp = name; 
    name = [string copy]; 
    [tmp release]; 
} 
+(NSString *)getUsername{ 
    return name; 
    //or for more atomic operation [[name copy] autorelease] 
} 

@end 
+0

感謝您的詳細答案:)通過上下文,你是否指核心數據中的管理上下文?我對他們的細節知之甚少,但我已經閱讀過它。 – Sachin

+1

不一定,只是一個伴隨整個操作的對象...即,如果操作是URL連接,則可能有一個URLConnectionContext,它收集所有數據並報告操作的成功或失敗。或者如果你的操作是一些複雜的計算,你可能有一個對象將計算的各個方面保存爲變量......基本上只是一個可以以原子方式保存狀態的實體,這樣你就可以把它扔掉並在適當的時候重新開始次,並且不會因並行操作而受到污染。 –

+0

聽起來很完美! – Sachin