문제

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

SystemSoundID (UINT32)는 자동으로 할당 된 것입니까? 아니면 명시 적으로 할당해야합니까? 이런 식으로 수행하고 유틸리티 메소드가 초기화되지 않았는지 테스트해야합니다. static SystemSoundID soundID = [Utilities createSystemSoundIDFromFile:@"beep" ofType:@"caf"];. 처음에 나는 그것을 NULL에 할당하려고 시도했지만, 나는 그것을 포인터가 아니라는 것을 깨달았습니다. = 0 거기에 있었습니까 아니면 중복됩니까?

도움이 되었습니까?

해결책

이 질문에는 대상 C 기능이 포함되지 않으므로 답은 C 표준에 있습니다.

C99, 섹션 §6.7.8, 단락 10 :

정적 저장 시간이있는 객체가 명시 적으로 초기화되지 않은 경우 :

...

- 산술 유형이있는 경우 (양수 또는 서명되지 않은) 0으로 초기화됩니다.

UINT32 (자체 자체는 UINT32_T)는 산술 유형입니다. 따라서 0으로 초기화되었습니다.

다른 팁

이것은 유형과 관련이 없습니다. 스토리지 클래스와 관련이 있습니다. C에서는 정적 및 글로벌 변수가 자동으로 0으로 초기화됩니다. 일반 로컬 (자동) 변수는 자동으로 초기화되지 않으므로 직접 수행해야합니다. 그렇지 않으면 쓰레기가 포함되어 있습니다.

나는 객관적인 C가 이것에 대해 C와 동일한 규칙을 따른다고 생각합니다.

정적 및 글로벌 변수는 0으로 초기화되고 로컬 (IE Auto) 변수는 초기화되지 않으며 예측할 수없는 값으로 시작할 수 있습니다.

즉, 값을 0으로 명시 적으로 초기화하는 것은 아프지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top