2009-10-02 37 views
1
- (void)playAlarmSound:(NSTimer *)theTimer { 
    static SystemSoundID soundID/* = 0 */; // ? 
    if (!soundID) { 
     soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"]; 
    } 
    ... 
} 

SystemSoundID(這是一個UInt32)自動分配0?或者我應該明確地分配它?我必須這樣做,然後測試它是否未被Utilities方法初始化,因爲如果我只是執行static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];,它就不會編譯。起初我嘗試將它分配給NULL,但後來我意識到它不是一個指針,所以無論如何,我應該在那裏還是它是多餘的?Objective C - SystemSoundID的(typedef'd UInt32)是否自動分配0?

回答

4

這個問題不涉及任何Objective-C的功能,所以答案是C標準中。

C99,部分§6.7.8,第10段:

如果具有 靜態存儲期間的對象不明確 初始化,然後:

...

- 如果它具有算術類型,則將其初始化爲(正數或無符號) 零;

UInt32(它本身就是uint32_t)是一種算術類型。因此,初始化爲零。

2

這與這個類型沒有任何關係 - 它與存儲類有關。在C中,靜態變量和全局變量會自動初始化爲0.普通的本地(auto)變量不會自動初始化,所以您必須自己做,否則它們會包含垃圾。

2

我相信objective-c遵循與C相同的規則。

靜態和全局變量初始化爲0,而本地(即自動)變量未初始化,並且可以以不可預知的值開始。

這就是說,它不傷害值明確初始化爲0