재정의 된 설명 메서드에서 개체의 메모리 주소를 NSLog


116

객체의 설명 방법을 재정의하고 있습니다. 아래 코드에서 {???} 를 대체하기 위해 객체의 메모리 주소를 인쇄하는 방법을 알고 싶습니다 .

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@",
            {???}, self.parameterOne, self.paramterTwo];
}

다음과 같이 콘솔에 인쇄하고 싶습니다.

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages

답변:


212

주소를 인쇄하려면 %p형식 지정자와 자체 포인터를 사용하십시오.

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}

6
'% @'지정자와 함께 self를 사용하면 -description 메서드를 다시 호출하므로 실제로 재귀가 발생합니다. % p 지정자는 포인터 주소를 출력합니다
Vladimir

3
나는 경향이 있습니다 [NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];. 주소는 거기에 있기 때문에 끝납니다 NSObject. 그러나 당신은 또한 당신이 상속 할 수있는 어떤 수퍼 클래스에서 디버깅과 관련이 있다고 결정한 것을 버리지 않습니다.
Tommy

7
추가 참고 사항 : %p유형의 포인터를 예상하고으로 다시 void *캐스팅해야 합니다. 그렇지 않으면 정의되지 않은 동작이 발생합니다. selfvoid *

4
@ user529758 : 캐스트 할 필요가 없으며 정의되지 않은 동작이 없습니다. void *그리고 id, 거의 동일합니다, 당신은 그것을 던져 어떠했는지,이 경우에는 차이가 없습니다 void *여부.
Michael

1
당신은 '자기'전에 '&'인수 기호를 넣어이
툠 Devyatov

6

가장 쉬운 방법은 슈퍼 설명을 사용하는 것입니다.

- (NSString *)description
{
    return [NSString stringWithFormat:@"%@ Area: %@, %@", [super description], self.identifier, self.name];
}

따라서 NSObject의 하위 클래스 인이 모델 객체의 경우 추가 작업을 피하고 %p.

수동으로 NSStringWithClass () 및 % p 사용

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p> Area: %@, %@", NSStringFromClass([self class]), self, self.identifier, self.name];
}

따라서이 클래스에서 파생 된 구체적인 구현자가있는 객체 모델의 경우 올바른 클래스 이름을 표시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.