2013-04-30 1 views
4

Objective-c에서 알 수없는 개체의 모든 인스턴스 변수 목록을 (디버그를 통해) 얻을 수있는 방법이 있습니까?디버그 : 알 수없는 개체의 모든 인스턴스 변수 목록을 얻으십시오

디버깅을 위해 lldb를 사용하지만, 잘 모르겠다는 것을 인정합니다.

분명히 알 수없는 개체의 헤더를 볼 수 없습니다.

디버깅 할 때해야하지만 가능하지 않은 경우 런타임에 대안을 사용할 수 있습니다. 내가 이해, 내가 알고있는 클래스 (I 객체의 헤더를 필요)

어떤 제안을 할 필요가 How do I list all fields of an object in Objective-C?하지만 :

이 게시물을 발견했습니다?

답변

13

링크 된 질문에 대한 대답의 코드를 사용하면 디버깅하는 동안 언제든지 호출 할 수 있도록 편리한 방법으로 래핑하면됩니다. 귀하의 장소에서 NSObject을 확장하는 범주를 작성하고 NSDictionary 및 모든 ivars를 반환하는 메서드를 추가하십시오. 직접적 또는 간접적으로 에서 NSObject의 상속하는 경우 방금 사전이 메서드에서 반환 인쇄해야, 유형을 모르고있는 객체 주어진 다음

- (NSDictionary*) ivars 
{ 
    NSMutableDictionary* ivarsDict=[NSMutableDictionary new]; 
    unsigned int count; 
    Ivar* ivars=class_copyIvarList([self class], &count); 
    for(int i=0; i<count; i++) 
    { 
     Ivar ivar= ivars[i]; 
     const char* name = ivar_getName(ivar); 
     const char* typeEncoding = ivar_getTypeEncoding(ivar); 
     [ivarsDict setObject: [NSString stringWithFormat: @"%s",typeEncoding] forKey: [NSString stringWithFormat: @"%s",name]]; 
    } 
    free(ivars); 
    return ivarsDict; 
} 

:

다음은 예입니다
(lldb) po [someObject ivars] 

크레딧 : How do I list all fields of an object in Objective-C?

추신 : 당신은 objc/runtime.h을 가져와야합니다.

+0

네, 아주 좋습니다! 추가 정보 : 알 수없는 객체 ivars (개인 Apple 객체라고 가정)에 대한 정보를 인쇄하려면 ivars를 포함하여 해당 클래스에 대한 가짜 헤더를 만들어야합니다. 그렇지 않으면 lldb가 오류를 줄 것입니다. 고마워요! – LombaX

+0

+1, 멋지고 자세한 답변. – Maroun