- (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
还是多余的?
答案 0 :(得分:4)
此问题不涉及任何Objective-c功能,因此答案可在c标准中找到。
C99,第§6.7.8节,第10段:
如果有一个对象 静态存储持续时间不是 显式初始化,然后:
...
- 如果它有算术类型,则为 初始化为(正数或无符号) 零;
UInt32(本身就是uint32_t)是一种算术类型。因此,初始化为零。
答案 1 :(得分:2)
这与类型没有任何关系 - 它与存储类有关。在C中,静态和全局变量自动初始化为0.普通的本地(自动)变量不会自动初始化,因此您必须自己进行,否则它们将包含垃圾。
答案 2 :(得分:2)
我认为objective-c遵循与C相同的规则。
静态和全局变量初始化为0,而本地(即自动)变量未初始化,并且可能以不可预测的值开始。
也就是说,将值显式初始化为0并没有什么坏处。