为包含集合的嵌套类正确实现NSObject描述方法

时间:2010-12-02 15:41:59

标签: iphone

使用我自己的类,我通常会覆盖 - (NSString *)描述方法来简化调试。 但是,当我调用我实现的类的描述时,从我的其他类中调用递归描述方法,来自“更深”类的所有格式化字符都被转义。这使得任何漂亮的打印都难以实现。 这是一个让它更清晰的例子:

@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类描述的\ n换行符将在A类描述方法的输出中被转义。任何想法如何摆脱或规避这种行为?打印全部包含集合的嵌套类时尤其烦人。

2 个答案:

答案 0 :(得分: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,但它是我发现的唯一方法。

答案 1 :(得分:0)

您可以使用回车\r,它也将以新的一行结束(即使在NSArray的描述中)。
但它不会缩进输出。在我的情况下,我刚刚添加了8个空格(\t也将被转义),这对于普通和数组输出看起来不错,但不如对于更深层的结构那么好。