2010-12-02 2 views
5

С моими собственными классами я обычно переопределяю метод описания (NSString *), чтобы облегчить отладку. Однако при вызове описания в классе, который я реализовал, который вызывает метод рекурсивного описания из моих других классов, все символы форматирования из «более глубоких» классов экранируются. Это затрудняет реализацию любой довольно сложной печати. Вот пример, чтобы сделать его более ясным:Правильная реализация метода описания NSObject для вложенных классов, содержащих коллекции

@interface Foo { 
    NSArray *barsArray; 
} 
@end 
@implementation Foo 
- (NSString *)description { 
    return [NSString stringWithFormat: @"foo contents: %@", barsArray]; 
} 

@interface Bar { 
    NSString *s1; 
    NSString *s2; 
} 
@implementation Bar 
- (NSString *)description { 
    return [NSString stringWithFormat: @"s1: %@\ns2: %@", s1, s2]; 
} 

В этом случае \ п символы перевода строки из описания класса B получит убежали на выходе класса А метод описания. Любая идея, как избавиться от этого поведения или обойти его? Это особенно раздражает при печати вложенных классов, которые содержат коллекции.

+0

Если я возьму вашу реализацию, сделав barArray a Bar *, а затем вызовет объект print на объекте Foo, строка новой строки будет правильно напечатана, а не экранирована. Где именно ваша проблема? – 2010-12-02 16:00:59

+0

если вместо массива Bar у вас будет один элемент Bar *, который вы правы, все будет напечатано правильно. Однако с массивом кажется, что метод описания для массива, избегает строк, возвращаемых из описания вызова на элементах массива – maciejs 2010-12-02 16:36:44

ответ

2

Вы всегда можете использовать красивое форматирование, с которым поставляются стандартные контейнеры. Например, ваше описание Бар может быть:

- (id)containerDescription { 
    return [NSDictionary dictionaryWithObjectsAndKeys:s1, @"s1", s2, @"s2", nil]; 
} 

- (NSString *)description { 
    return [self.containerDescription description]; 

Теперь вы можете сделать следующее на Foo:

- (NSString *)description { 
    NSArray *desc = [barsArray valueForKey:@"containerDescription"]; 
    NSDictionary *descriptionDictionary = 
    [NSDictionary dictionaryWithObjectsAndKeys:desc, @"foo contents", nil]; 
    return [descriptionDictionary description]; 
} 

решение не является оптимальным, конечно, как вы должны иметь второй метод и есть для вызова containerDescription на более высоких уровнях, но это единственный, который я нашел.

0

вы можете использовать возврат каретки \r, который также попадет в новую строку (даже в описании NSArray).
Но он не будет отступать от выхода. В моем случае я просто добавил 8 пробелов (\t тоже будет экранирован), который будет хорошо выглядеть для простого и массивного вывода, но не так хорош, как может быть для более глубоких структур.

Смежные вопросы