2009-06-13 6 views
72

int을 Objective-C에서 항상 0으로 초기화하는 것이 안전합니까?int는 항상 0으로 초기화됩니까?

보다 구체적으로 말하자면, int ivars를 가진 객체가 새로 인스턴스화되었을 때, 그 ivars의 값이 0이라고 가정하는 것이 안전한가요?

답변

110

예, 클래스 인스턴스 변수는 항상 0으로 초기화됩니다 (정확한 데이터 유형에 따라 nil, NULL 또는 false). 그 클래스에 새로운 인스턴스를 연결하는 isa 변수를 제외하고, 즉,

alloc 방법 동적으로 새 개체의 인스턴스 변수에 대한 메모리를 할당하고 0 - 모두 모두 초기화 다음 Objective-C 2.0 Programming Language 참조.


EDIT 2013 년 5 월
애플 (현재 웨이 백 머신에 연결) 위의 문서를 제거 것으로 보인다. (현재) 현재 문서 Programming With Objective-C 비슷한 인용문이 포함

alloc 방법은 제로로 설정하여 개체의 속성에 할당 된 메모리를 취소하는 것입니다 다른 하나 개의 중요한 과제가 있습니다. 이렇게하면 이전에 저장 한 것의 가비지를 포함하는 메모리의 일반적인 문제는 피할 수 있지만 객체를 완전히 초기화하기에는 충분하지 않습니다.


그러나,이 클래스의 인스턴스 변수 사실; 그 전역에서 선언 POD 유형도 마찬가지이다 한 가지 예외

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

, 그것은 또는 malloc() 또는 realloc() 할당 데이터를 로컬 변수 하지 사실; calloc()의 경우는 calloc()이 할당하는 메모리를 명시 적으로 0으로 지정하기 때문에 true입니다.

ARC (Automatic Reference Counting)를 사용하면 Objective-C 개체에 대한 스택 포인터가 암시 적으로 nil으로 초기화됩니다. 그러나이를 명시 적으로 nil으로 초기화하는 것이 좋습니다. Transitioning to to ARC Release Notes에서 :

스택 변수가 nil

스택 변수를 약한 강력한 ARC를, 사용 및 autoreleasing 초기화됩니다 지금은 암시 적으로 C에서 nil

초기화됩니다 ++ (그리고 C++ 객체 인 Objective-C++에서 사용됨), 클래스 인스턴스 변수도 이 아니며이 초기화되지 않습니다. 생성자에서 명시 적으로 초기화해야합니다.

+3

Spot on. 그러나 사람들이이 세부 사항에 대해 종종 궁금해하는 사실은 변수를 초기화하는 것, 아마도 틀림없이 "더 안전한"선택에 대해 더 명확하게 설명 할 수있는 충분한 이유가 될 수 있습니다. 0/nil/NULL로 초기화하면 아무에게도 해를 끼치 지 않습니다. :-) –

+0

나는 Quinn에 동의합니다. 그러나이 경우에는 - (void) init을 구현하지 않는 "추상"클래스를 만들고 모든 하위 클래스가 ivars를 초기화하도록 강요하고 싶지는 않습니다. 따라서 0으로 초기화되는 것으로 간주 할 수 있다는 것을 알고있는 것이 좋습니다. – Felixyz

+0

iOS의 릴리스 모드에서도 내 경험은 지역 변수도 0으로 초기화됩니다. – jjxtra

-1

초기화에 대한 값을 가정하지 않아도됩니다. "0"값 주위에 논리를 작성하는 경우에는 반드시 논리를 설정해야합니다.

+0

Adam의 답변이 Objective-C에 적용되는 동안이 내용을 C++에 대한 유효한 답으로 볼 수 있다고 가정합니다. – Felixyz

+11

Adam의 Objective C에 대한 대답은 정확히 맞습니다. Objective C는 ivars가 할당시 nil/NULL/false/0으로 설정되며이 사실을 받아들이고 사용하는 것이 합리적입니다. 예를 들어, NSMultableArray * ivars를 [NSMultableArray array or new]로 초기화하면 초기화가 지연 될 수 있습니다. ObjectiveC guarentteing [(NSMultableArray *) count]와 함께 0을 반환하면 초기화를 더 지연시킬 수 있습니다. 목표 C가 그 차이점에 맞서 싸우는 것이 아니라 그것을하는 방식을 사랑하는 법을 배웁니다. –

-2

예, C 전역 변수는 0으로 초기화됩니다. Objective-C조차도 로컬 변수가 0으로 초기화됩니다. 당신은 그것을 의지 할 수있다.

+1

@ AdamRosenfield의 대답은 로컬 변수가 0으로 초기화되었다는 주장과 직접적으로 모순됩니다. 누가 잘못 했습니까? –

관련 문제