int
을 Objective-C에서 항상 0으로 초기화하는 것이 안전합니까?int는 항상 0으로 초기화됩니까?
보다 구체적으로 말하자면, int
ivars를 가진 객체가 새로 인스턴스화되었을 때, 그 ivars의 값이 0이라고 가정하는 것이 안전한가요?
int
을 Objective-C에서 항상 0으로 초기화하는 것이 안전합니까?int는 항상 0으로 초기화됩니까?
보다 구체적으로 말하자면, int
ivars를 가진 객체가 새로 인스턴스화되었을 때, 그 ivars의 값이 0이라고 가정하는 것이 안전한가요?
예, 클래스 인스턴스 변수는 항상 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++에서 사용됨), 클래스 인스턴스 변수도 이 아니며이 초기화되지 않습니다. 생성자에서 명시 적으로 초기화해야합니다.
초기화에 대한 값을 가정하지 않아도됩니다. "0"값 주위에 논리를 작성하는 경우에는 반드시 논리를 설정해야합니다.
Adam의 답변이 Objective-C에 적용되는 동안이 내용을 C++에 대한 유효한 답으로 볼 수 있다고 가정합니다. – Felixyz
Adam의 Objective C에 대한 대답은 정확히 맞습니다. Objective C는 ivars가 할당시 nil/NULL/false/0으로 설정되며이 사실을 받아들이고 사용하는 것이 합리적입니다. 예를 들어, NSMultableArray * ivars를 [NSMultableArray array or new]로 초기화하면 초기화가 지연 될 수 있습니다. ObjectiveC guarentteing [(NSMultableArray *) count]와 함께 0을 반환하면 초기화를 더 지연시킬 수 있습니다. 목표 C가 그 차이점에 맞서 싸우는 것이 아니라 그것을하는 방식을 사랑하는 법을 배웁니다. –
예, C 전역 변수는 0으로 초기화됩니다. Objective-C조차도 로컬 변수가 0으로 초기화됩니다. 당신은 그것을 의지 할 수있다.
@ AdamRosenfield의 대답은 로컬 변수가 0으로 초기화되었다는 주장과 직접적으로 모순됩니다. 누가 잘못 했습니까? –
Spot on. 그러나 사람들이이 세부 사항에 대해 종종 궁금해하는 사실은 변수를 초기화하는 것, 아마도 틀림없이 "더 안전한"선택에 대해 더 명확하게 설명 할 수있는 충분한 이유가 될 수 있습니다. 0/nil/NULL로 초기화하면 아무에게도 해를 끼치 지 않습니다. :-) –
나는 Quinn에 동의합니다. 그러나이 경우에는 - (void) init을 구현하지 않는 "추상"클래스를 만들고 모든 하위 클래스가 ivars를 초기화하도록 강요하고 싶지는 않습니다. 따라서 0으로 초기화되는 것으로 간주 할 수 있다는 것을 알고있는 것이 좋습니다. – Felixyz
iOS의 릴리스 모드에서도 내 경험은 지역 변수도 0으로 초기화됩니다. – jjxtra