본문 바로가기
프로그래밍 놀이터/iOS

[Effective Objective-C] #17 description 메서드를 구현하라

by 돼지왕 왕돼지 2017. 8. 20.
반응형

 [Effective Objective-C] #17 description 메서드를 구현하라


출처 : Effective Objective-C

debugDescription, Debugger, description, description tip, lldb, NSDictionary, nsobject, nsproxy, PO, print-object, [Effective Objective-C] #17 description 메서드를 구현하라, 규칙, 기본 구현, 디버거, 디버깅, 로깅, 메모리 주소, 최상위 클래스, 클래스 이름, 포인터 주소, 프로토콜, 프로퍼티



-

디버깅할 때 객체의 내용을 출력하면 유용할 때가 있다.

내용을 출력하는 방법 중 하나는 객체의 모든 프로퍼티를 출력하는 로깅 코드를 작성하는 것이지만, 다음과 같이 하는 것이 더 일반적인 방법이다.

NSLog(@“object = %@“, object);


문자열이 로그로 기록될 때 object 는 description 메시지를 받을 것이다.



-

여러분이 만든 클래스에서 NSObject 기본 구현의 description 이 호출될 것이다.

이 메서드는 NSObject 프로토콜에 정의되어 있지만, NSObject 클래스가 구현한다.

많은 메서드가 NSObject 프로토콜에 속해있는데 그 이유는 NSObject 가 유일한 최상위 클래스가 아니기 때문이다.

NSProxy 는 NSObject 프로토콜을 따르는 또 다른 최상위 클래스의 한 예다.

description 같은 메서드가 프로토콜에 정의되어 있기 때문에 이런 최상위 클래스의 하위 클래스는 반드시 프로토콜의 메서드들을 구현해야 한다.



-

NSObject 가 구현한 description 은 클래스 이름과 그 옆에 객체가 있는 메모리의 주소만 보여준다.

좀 더 유용한 내용을 출력하게 하기 위해선 description 을 자신의 객체에서 표현하길 원하는 문자열을 반환하게 재정의하면 된다.

- (NSString*)description {

     return [NSString stringWithFormat:@“<%@: %p, \”%@ %@\”>”, [self class], self, _firstName, _lastName];

}



-

description 메서드를 구현할 때 기본 구현처럼 클래스 이름과 포인터 주소도 같이 표시하는 것을 추천한다.

때때로 그 내용이 유용할 수 있기 때문이다.

꼭 그렇게 하라는 강제적은 규칙은 없다.



-

많은 양의 정보를 포함하는 description 메서드를 간단하게 작성하는 방법은 NSDictionary 의 description 메서드를 활용하는 것이다.

사용자가 만든 description 메서드에서 사전을 활용하여 사전의 description 메서드가 포함하는 문자열을 반환하도록 하면 훨씬 간략한 description 메서드 구현이 가능하다.

- (NSString*)description{

     return [NSString stringWithFormat:@“<%@: %p, %@>“, [self class], self,

               @{@“title” : _title,

                    @“latitude” : @(_latitude),

                    @“longitude” : @(_longitude}];

}


클래스의 프로퍼티 수가 많아지고, 모든 프로퍼티를 description 메서드에서 표현하려면 NSDictionary 를 쓰는 것이 훨씬 수월할 것이다.



-

debugDescription 도 있다.

이 메서드가 하는 일은 description 과 매우 비슷하다.

description 과 다른 점은 debugDescription 은 디버거에서 print-object 명령어를 실행했을 때만 호출된다는 것이다.

NSObject 클래스의 debugDescription 의 기본 구현은 description 을 직접 호출하는 것이다.



-

LLDB 에서 po 명령어를 입력하면 print-object 함수를 실행할 것이다.



-

description 에서는 기본 정보만 제공하고, debugDescription 메서드는 description 보다 더 많은 정보를 제공하길 원할 수 있다.




기억할 점


인스턴스를 설명하는 유용한 문자열을 제공하려면 description 메서드를 구현하라.


객체가 출력하는 내용을 디버깅할 때 좀 더 자세해지길 원한다면 debugDescription 을 구현하라.



반응형

댓글