2014-09-19 61 views
0

有幾個問題看起來與此類似(例如Objective C Static Class Level variables)並且我讀過,但我仍感到困惑。值得注意的是,各種答案似乎與對initialize的呼叫有所不同。Objective-C:運行時的類變量?

我有一個類Foo。在運行時,我的應用程序詢問後端以找出Foo應該使用什麼「類參數」(即這些參數將在Foo的所有實例中共享)。我知道如何處理後端等,但我不知道我的Objective-C方法是否正確。我應該說:它確實有效。但是,我不知道我在做什麼。

編輯:我認爲它的工作。但不時,我得到一個奇怪的例外: libsystem_platform.dylib _os_lock_recursive_abort

它發生在初始化時,我分配/初始化NSDictionary

Foo.h: 

+ (NSDictionary *)parameters; 
+ (void)setParameters:(NSDictionary *)params; 

Foo.m: 

static NSDictionary *parameters = nil; 

@implementation Foo 

+ (NSDictionary *)parameters{ 
    return parameters; 
} 

+ (void)setParameters:(NSDictionary *)params 
{ 
    parameters = params; 
} 

+ (void)initialize 
{ 
    [super initialize]; 
    if ((self == [Foo self]) && !parameters) // Is this right?? 
     parameters = [[NSDictionary alloc] init]; 
} 

@end 

... somewhere else, in another class ... 

[Foo setParameters:dictionaryOfParams]; 

回答

1

只是一個小小的改進。

據蘋果+ (void)initialize文檔:

初始化時調用每班只有一次。

如你忽略了initialize當它被從子類叫你能從如果條件刪除!parameters。因爲你確定它只會運行一次。

+0

謝謝Nuno。我只是添加了一條評論:我偶爾會遇到一個奇怪的例外。所以我猜想有些事情是不對的... – PJC 2014-09-19 15:12:39