2011-11-21 2 views
1

내 objective-c 프로그램에서 (또는 어쩌면 디버깅 유틸리티에서) 기괴한 동작이 발생합니다.
Rectangle *left, *right, *bottom, *upper;Objective-C 메모리 세부 정보

오른쪽이 줄 끝에서, 나는 내 4 개 개체의 모든 (널 포인터가 될 것으로 기대 :
나는 (그것을 "사각형"하자) 정의하지만, 할당 또는 일부 클래스의 4 개 인스턴스를 초기화되지 Xcode에서 디버깅)하지만, 그 중 하나 (구체적으로 "upper")는 일부 메모리 위치를 가리키며, 그의 속성은 임의의 값으로 초기화됩니다.
정상적인 동작입니까? 그렇다면 이유를 설명해주십시오. (나는 객관적인 - C 프로그래밍 조금 새로운)

답변

5

목표 C는 (일반적으로) 스택 값이 0으로 보장하지 않습니다. 그것은 개체의 모든 ivars가 0으로 보장합니다. 또한 ARC에서는 객체라는 것을 알고있는 스택 바를 0으로 만듭니다. 따라서 ARC를 사용하지 않는다고 가정 할 때 보이는 동작은 정확합니다.

일반적으로 값이 0 인 환경에 있더라도 코드가 다른 곳에서 재사용 될 수 있도록 명시 적으로 제로화해야합니다. 코드가 작동해야하는 제약 조건이 있으면이를 만족 시키거나 런타임에 테스트하거나 컴파일 타임에 테스트해야합니다 (assert()).

이유는 C가 그런 식으로 동작하기 때문입니다. C는 전통적으로 금속을 사용하지 않았기 때문에 컴파일러가 성능 최적화를 위해 많은 자유를 갖기를 선호합니다. . 목표 C는 자신의 (보충) 기능을 지원하기 위해 필요한 곳에서만 다릅니다.

2

프로 팁 : 절대로 아무것도 가정하지 마십시오. 모든 변수를 알려진 값으로 초기화하는 것이 좋습니다. 이 경우 nil입니다.

변수를 초기화하는 또 다른 고급 언어에서 온 경우 글쎄 ...이 언어는 아닙니다. :-)

0

당신은이 작업을 수행해야 ...

동일
Rectangle *left = nil; 
Rectangle *right = nil; 
Rectangle *bottom = nil; 
Rectangle *upper = nil; 

Rectangle *left = nil, *right = nil, *bottom = nil, *upper = nil; 
0

메모리 관리와 같은 놀라운 당신을 더 이상 처리하지 않습니다 사용 ARC!