[Effective Objective-C] #17 description 메서드를 구현하라
출처 : Effective Objective-C
-
디버깅할 때 객체의 내용을 출력하면 유용할 때가 있다.
내용을 출력하는 방법 중 하나는 객체의 모든 프로퍼티를 출력하는 로깅 코드를 작성하는 것이지만, 다음과 같이 하는 것이 더 일반적인 방법이다.
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 을 구현하라.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] #19 명확하고 일관된 작명법을 사용하라 (0) | 2017.08.30 |
---|---|
[Effective Objective-C] #18 가변 객체보다는 불변 객체를 사용하라 (0) | 2017.08.21 |
[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #9 ~ #16 (0) | 2017.08.19 |
[Effective Objective-C] #16 지정 초기화 메서드를 만들라 (0) | 2017.08.18 |
[Effective Objective-C] #15 접두어를 사용해 네임스페이스 충돌을 피하라 (0) | 2017.08.17 |
댓글