2013-08-06 8 views
8

개체의 -(NSString*)description을 무시하지만 Xcode는 항상 변수보기의 요약 필드에 error: summary string parsing error을 표시합니다. 내가 콘솔에서 po objectName 입력하면Xcode의 NSObject 설명 및 사용자 지정 요약

- (NSString*)description { 
    return [NSString stringWithFormat:@"<%@ %p> x=%f, y=%f", self.class, self, _x, _y]; 
} 

이 LLDB이 p objectName 항상 오류를 표시하지만 엑스 코드와 명령, 예상대로 좋은 출력을 보여줍니다, 그래서에 대해 적절한 디버그 설명 형식 내용은 다음과 같습니다

나의 현재 구현은 다음과 같다 요약 필드 작업을 하시겠습니까? "p"명령의 출력은 Foundation 클래스의 인스턴스에 대해 Xcode에서 볼 수있는 요약 메시지와 같습니다.

업데이트 :

나는 "엑스 코드에서 WWDC 2012 세션 디버깅"에서 볼 수 있듯이 지금까지, 사용자 정의 요약은 사용자 정의 파이썬 스크립트만을 사용하여 구현 될 수있다. -(NSString*)description 또는 -(NSString*)debugDescription 메서드는 요약 메시지에 연결되지 않습니다. 내가 오류를 표시했기 때문에 그들이 있다고 생각했지만, 그것은 자신의 포맷터가없는 클래스의 표준 메시지 인 것 같습니다.

+0

당신은 "오버라이드 (override)"라고 말합니다 - 이것은 서브 클래스 또는 카테고리입니까? 그리고 수퍼 클래스가 무엇입니까? –

+2

그리고 Xcode에서 "p objectName"을한다고 말하는 것은 아닙니다. Xcode 디버거에서는 항상 객체에 대해'po'를했습니다. 'p'는 스칼라를위한 것입니다. –

+0

주목할 점 중 하나는, Hot Licks는 lldb가 어떤 형식도 실행하지 않고 객체를 포맷하는 방법을 알고있는 내장 포맷터를 가지고 있기 때문에 "p objectName"이 표준 Foundation 객체 (NSString, NSArrays 등)의 대부분에서 작동한다는 것입니다 코드를 작성하십시오. Andy가 그의 업데이트에서 언급했듯이, Python으로 자신 만의 객체에 대한 사용자 정의 포맷터를 작성할 수도 있습니다. –

답변

2

내가 제안 적어도 :

- (NSString*)description { 
    return [NSString stringWithFormat:@"%@; x=%f, y=%f", [super description], _x, _y]; 
} 

수동으로 NSObject 기본을 복제하여 귀하의 슈퍼 클래스가 포함하도록 선택했습니다 수있는 기본이 아닌 행동을 차단하지 않을 그래야.

그 외에도 "요약 문자열 구문 분석 오류"는 lldb 오류입니다. 디버거에서만보고됩니다. its documentation에 따라 po은 Objective-C 개체에 대해 정확합니다. p은 C 또는 C++ 객체 용입니다. 따라서 오류에주의 할 필요가 없습니다. 기본적으로 잘못된 lldb 명령을 사용했다고 말하는 것입니다.

편집 : 그것은 가치가 무엇인지, CFArray에서 사용하는 방법은 open source과 모양에 대해 : 엑스 코드의 디버거 ISN을 : 나는 대답이라고 도박을 기꺼이 위의 다른 의견과 마찬가지로

static CFStringRef __CFArrayCopyDescription(CFTypeRef cf) { 
    CFArrayRef array = (CFArrayRef)cf; 
    CFMutableStringRef result; 
    const CFArrayCallBacks *cb; 
    CFAllocatorRef allocator; 
    CFIndex idx, cnt; 
    cnt = __CFArrayGetCount(array); 
    allocator = CFGetAllocator(array); 
    result = CFStringCreateMutable(allocator, 0); 
    switch (__CFArrayGetType(array)) { 
    case __kCFArrayImmutable: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = immutable, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    case __kCFArrayDeque: 
    CFStringAppendFormat(result, NULL, CFSTR("<CFArray %p [%p]>{type = mutable-small, count = %u, values = (%s"), cf, allocator, cnt, cnt ? "\n" : ""); 
    break; 
    } 
    cb = __CFArrayGetCallBacks(array); 
    for (idx = 0; idx < cnt; idx++) { 
    CFStringRef desc = NULL; 
    const void *val = __CFArrayGetBucketAtIndex(array, idx)->_item; 
    if (NULL != cb->copyDescription) { 
     desc = (CFStringRef)INVOKE_CALLBACK1(cb->copyDescription, val); 
    } 
    if (NULL != desc) { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : %@\n"), idx, desc); 
     CFRelease(desc); 
    } else { 
     CFStringAppendFormat(result, NULL, CFSTR("\t%u : <%p>\n"), idx, val); 
    } 
    } 
    CFStringAppend(result, CFSTR(")}")); 
    return result; 
} 

어떤 의미에서든 똑똑하고 정확하게 올바른 # po Objective-C 설명을 얻는 방법을 사용할만큼 똑똑하지 않습니다. 당신의 객체가 uninflected Objective-C 객체라면 디버거는 그것을 이해할 수 없을 것입니다.

+0

제안 해 주셔서 감사합니다. NSArray가 가지고있는 것과 같은 멋진 힌트를 원한다. 배열의 요소 수를 보여준다. – Andy

+0

...'po '를 입력하고 싶지 않으십니까? 차이가 있다면, 추측에 따라 NSArray는 수신자 부담으로 연결되어 있으므로 Objective-C 객체 일뿐만 아니라 적어도 하나의 다른 종류의 객체이기도합니다. – Tommy

+1

Tommy, 디버깅 중에 Xcode 변수보기에 표시되는 요약 메시지입니다. 매우 유용 할 수 있으므로 아무 것도 입력하지 않아도됩니다. – Andy

관련 문제