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

mac*_*ejs 5 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];
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,来自B类描述的\n换行符将在A类描述方法的输出中被转义.任何想法如何摆脱或规避这种行为?打印全部包含集合的嵌套类时尤其烦人.

w-m*_*w-m 2

您始终可以利用标准容器附带的良好格式。例如,您的酒吧描述可以是:

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

- (NSString *)description {
  return [self.containerDescription description];
Run Code Online (Sandbox Code Playgroud)

您现在可以对 Foo 执行以下操作:

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

当然,该解决方案并不是最佳的,因为您必须有第二种方法,并且必须在更高级别上调用 containerDescription,但这是我发现的唯一一个。