Program Tip

int는 항상 0으로 초기화됩니까?

programtip 2020. 10. 24. 11:41
반응형

int는 항상 0으로 초기화됩니까?


intObjective-C에서 s가 항상 0으로 초기화되는 것을 계산하는 것이 안전 합니까?

보다 구체적으로, intivars가 있는 객체 가 새로 인스턴스화 되었을 때 해당 ivar의 값이 0이라고 가정하는 것이 안전합니까?


예, 클래스 인스턴스 변수는 항상 0으로 초기화 (되거나 nil, NULL또는 false, 정확한 데이터 유형에 따라 다름). Objective-C 2.0 프로그래밍 언어를 참조하십시오 .

alloc메서드는 새 개체의 인스턴스 변수에 메모리를 동적으로 할당하고 모두 0으로 초기화합니다. isa즉, 새 인스턴스를 해당 클래스에 연결하는 변수는 제외 됩니다.


편집 2013-05-08
Apple은 위 문서를 제거 한 것 같습니다 (현재 The Wayback Machine에 연결됨). (현재) 활성 문서 Programming With Objective-C 에는 유사한 인용이 포함되어 있습니다.

alloc메서드에는 객체 속성에 할당 된 메모리를 0으로 설정하여 정리하는 또 다른 중요한 작업이 있습니다. 이것은 이전에 저장된 모든 것의 가비지를 포함하는 메모리의 일반적인 문제를 피하지만 객체를 완전히 초기화하기에는 충분하지 않습니다.


그러나 이것은 클래스의 인스턴스 변수 에만 해당됩니다. 전역 범위에서 선언 된 POD 유형에 대해서도 마찬가지입니다.

// At global scope
int a_global_var;  // guaranteed to be 0
NSString *a_global_string;  // guaranteed to be nil

한 가지 예외는이다 하지 로컬 변수 또는 데이터 할당에 해당 malloc()하거나 realloc(); 할당 된 메모리를 명시 적으로 제로화 calloc()하므로의 경우 참입니다 calloc().

한 가지 예외는 ARC (Automatic Reference Counting)가 활성화되면 Objective-C 객체에 대한 스택 포인터가 암시 적으로 다음으로 초기화된다는 것입니다 nil. 그러나 명시 적으로 초기화하는 것이 nil좋습니다. 로부터 ARC 릴리스 노트로 전환 :

스택 변수는 다음으로 초기화됩니다. nil

ARC를 사용하면 strong, weak 및 autoreleasing 스택 변수가 이제 다음과 같이 암시 적으로 초기화됩니다. nil

C ++ (및 Objective-C ++에서 사용되는 C ++ 개체)에서 클래스 인스턴스 변수도 0으로 초기화 되지 않습니다 . 생성자에서 명시 적으로 초기화해야합니다.


초기화를 위해 어떤 값도 가정해서는 안된다고 생각합니다. "0"값을 중심으로 논리를 작성하는 경우 확실하게 설정해야합니다.


예, C에서 전역 변수는 0으로 초기화됩니다. Objective-C에서는 로컬 변수도 0으로 초기화됩니다. 믿을 수 있습니다.

참고 URL : https://stackoverflow.com/questions/990817/are-ints-always-initialized-to-0

반응형