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,但后来我意识到它不是一个指针,所以无论如何,我应该= 0在那里还是它是多余的?

4

3 回答 3

4

这个问题不涉及任何objective-c特性,所以在c标准中可以找到答案。

C99,第 6.7.8 节,第 10 段:

如果具有静态存储持续时间的对象未显式初始化,则:

...

— 如果它具有算术类型,则将其初始化为(正或无符号)零;

UInt32(它本身就是 uint32_t)是一种算术类型。因此,初始化为零。

于 2009-10-02T00:44:15.070 回答
2

这与类型没有任何关系——它与存储类有关。在 C 中,静态和全局变量会自动初始化为 0。普通的局部(自动)变量不会自动初始化,因此您必须自己进行初始化,否则它们会包含垃圾。

于 2009-10-02T00:43:26.130 回答
2

我相信objective-c 遵循与C 相同的规则。

静态和全局变量初始化为 0,而局部(即自动)变量未初始化并且可以以不可预知的值开始。

也就是说,将值显式初始化为 0 并没有什么坏处。

于 2009-10-02T00:43:48.940 回答