2012-04-05 2 views
0

그래서 일부 샘플 코드에서 사용하고있는 몇 가지 속성이 있습니다. 특히 UIView 클래스의 "태그"속성 이제이 속성을 설정하고 NSLog 또는 태그 값을 기반으로하는 컨트롤 문을 설정하면 설정 한 값이 거기에 있으며 예상대로 작동하는 것을 볼 수 있습니다.XCode의 디버깅 속성

그러나 태그 값 위에 어떤 태그 값이 있는지 보려면 마우스를 .tag 위로 가져 가면 XCode에서 아무 것도 얻지 못합니다. 값을 보여주는 팝업이 없습니다. 그래서 자동/로컬/모든 창으로 이동하고 "추가 식 ..."시도합니다 (기존의 "감시"변수를 설정하는 유일한 방법 인 것 같습니다. 다른 방법이 있다면 알려주십시오). 어쨌든 나는 object.tag를 "watch"창에 넣었고 그것은 비어 있습니다. 가치 없음. 그것이 존재하지 않았던 것처럼 그것은 0이 아닙니다.

물론 "object.tag"의 "object"부분에 마우스를 올려 놓으면 확장하는 공개 사각형이있는 객체에 대한 팝업이 나타나고 "_ 태그"(기본 인스턴스 변수 인 것처럼 보임).

그래서 이것에 대해 무엇이 어렵습니까? 디버그 중에 태그 속성을 가리 키지 않는 이유는 무엇입니까? 이것은 XCode dev의 속성과 관련이 있습니까?

PS - 내가 엑스 코드의 최신 버전을 실행하고있어이 : 4.3.2

+0

나는 직사각형이 아닌 TRIangle을 공개했다 : – Chris

답변

1

tag 재산, 다른 오브젝티브 C 속성과 같은 문법 설탕입니다. 실제로 속성은 접근 자 메서드로 구현되며 차례로 objc_msgSend() 함수 호출로 변환됩니다. 이 기계류는 구조체 필드에 액세스하는 것과는 다릅니다.

디버거는 특별한 지식이 필요없고 결과가 없으므로 기본적으로 구조체의 모든 필드를 표시 할 수 있습니다. 구조체 정의 만 필요합니다. 반면 Objective-C 속성의 값을 얻으려면 프로세스 컨텍스트에서 코드를 실행해야합니다. 디버거 콘솔에서 수동으로 수행 할 수 있지만 디버거는 자동으로이 작업을 수행하지 않습니다.

이론적으로는 이 분리 된 경우이지만 믿을 수 없을만큼 어렵다고 생각합니다. 접근 자 메소드를 실행하면 객체의 내부 상태가 변경되는 경우를 생각해보십시오. 예를 들어 -[UIViewController view] (해당 view 속성에 액세스)을 호출하면보기가로드됩니다. 그러한 경우에 IDE의 속성 위에 마우스를 올려 놓으면 프로세스의 실행 상태가 변경되어 디버깅 자체가 농담이됩니다.

+0

나는이 속성이 통사론적인 설탕이라는 것을 알고 있었지만, 나는 당신이 지적한 결론을 내리지 않았다. 그것을 지워 줘서 고마워. 적어도 나는 존재하지 않는 무언가를 계속 찾지 않을 것이다. 관련 메모에서 일반적으로 속성으로 둘러싸인 이름을 찾는 방법은 무엇입니까? 예를 들어, 속성 태그가 래핑하는 기본 변수 인 _tag를 찾았습니다. 내가 찾고있는 것은 단지 앞에 붙은 밑줄을 가지고 있다고 가정하는 것을 싫어하기 때문에 이것을 발견하는 쉬운 방법이 있습니까? 나는 문서를 확인하고 아무것도 보지 못했습니다. – Chris

+0

일반적으로 속성은 "동적"일 수 있으므로 즉석에서 계산 된 값을 반환하므로 속성과 ivar 사이에는 상관 관계가 없습니다. 나는 그것이 나의 수업이고 내가 누구인지를 안다면 나는 결코 ivar 가치를 보지 않는다. 예를 들어, 일부 Apple 클래스에는 사용되지 않는 ivars, 명확한 목적이없는 ivars, 숨겨져 있거나 숨겨진 ivars (대개 개인 클래스의 객체)가 포함됩니다. 일반적으로 디버깅하는 동안 무제한 액세스 할 수있는 코드 인 코드 자체의 동작에 집중하는 것이 좋습니다. – Costique

+0

그렇다면 UIView와 같은 것을 추적하고 있습니다.태그 (다른 클래스에서 뭔가) 내 유일한 진짜 옵션 그런 다음 "블랙 박스"속성과 관련된 문제를 디버깅하는 경우 수동으로 출력 창에서 인쇄하는 것입니다? – Chris