【问题标题】:Objective C - Are SystemSoundID's (typedef'd UInt32) automatically assigned 0?Objective C - SystemSoundID(typedef'd UInt32)是否自动分配为0?
【发布时间】:2009-10-02 00:38:25
【问题描述】:
- (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 还是它是多余的?

【问题讨论】:

    标签: c objective-c initialization zero uint32


    【解决方案1】:

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

    C99,第 6.7.8 节,第 10 段:

    如果一个对象有 静态存储时间不 显式初始化,然后:

    ...

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-06-17
          • 1970-01-01
          • 2013-11-24
          • 1970-01-01
          • 1970-01-01
          • 2011-01-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多