目标C- SystemsoundID(typedef'd uint32)是否自动分配0?
-
19-09-2019 - |
题
- (void)playAlarmSound:(NSTimer *)theTimer {
static SystemSoundID soundID/* = 0 */; // ?
if (!soundID) {
soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
}
...
}
SystemsoundID(uint32)是否自动分配0?还是我应该明确分配它?我必须这样做并测试以查看是否尚未用实用程序方法初始化它,因为如果我只是这样做,它不会编译 static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];
. 。起初,我尝试将其分配给NULL,但后来我意识到它不是指针,所以无论如何,我是否应该有 = 0
在那里还是多余的?
解决方案
这个问题不涉及任何Objective-C功能,因此答案是在C标准中找到的。
C99,第6.7.8节,第10款:
如果未明确初始化具有静态存储持续时间的对象,则:
...
- 如果它具有算术类型,则将其初始化为(正或无符号)为零;
UINT32(本身就是UINT32_T)是算术类型。因此,初始化为零。
其他提示
这与类型无关 - 与存储类有关。在C中,静态变量和全局变量自动初始化为0。普通本地(自动)变量不会自动初始化,因此您必须自己执行或包含垃圾。
我相信Objective-C遵循与C相同的规则。
静态变量和全局变量初始化为0,而本地(IE自动)变量未初始化,并且可以从不可预测的值开始。
也就是说,明确将值初始化为0并没有什么伤害。
不隶属于 StackOverflow