苹果的对象如何在其描述中显示属性,我可以这样做吗?

时间:2012-10-31 09:28:17

标签: objective-c

我有一个包含两个属性的对象 - typename - 我希望在其description中显示。开箱即用的描述如下:

<SGBMessage: 0x7663bb0>

如果我覆盖description,就像这样:

return [NSString stringWithFormat:@"<%@: %x type:%@ name%@>", 
           [self class], (int)self, self.type, self.name];

然后我可以得到一个很好的描述:

<SGBMessage: 0x7663bb0 type:loadScreen name:mainScreen>

到目前为止,这么好。但Apple的对象具有动态描述;如果我查看视图的描述,我会得到这个:

<UIView: 0x767bcb0; frame = (0 0; 0 0); layer = <CALayer: 0x767bd50>>

但如果我将hidden设置为true,我会得到:

<UIView: 0x767bcb0; frame = (0 0; 0 0); hidden = YES;
 layer = <CALayer: 0x767bd50>>

现在,我不相信他们在所有对象的description方法中都有大量的if语句;似乎更有可能在NSObject的某个类别中有一些方法可以被覆盖以指定描述中显示哪些属性。有谁知道真正发生了什么,如果是的话,我可以利用它吗?

1 个答案:

答案 0 :(得分:1)

我倾向于采用这种模式:

- (NSString *) description {
    NSMutableDictionary *descriptionDict = [[NSMutableDictionary alloc]init];
    if (account)       [descriptionDict setObject:account       forKey:@"account"];
    if (date)          [descriptionDict setObject:date          forKey:@"date"];
    if (contentString) [descriptionDict setObject:contentString forKey:@"contentString"];
    return [descriptionDict description];
}

您可以使用类似的方法构建NSMutableArray,然后遍历数组,将字符串中的内容添加到字符串中。

对于更复杂的应用程序,如果您有从其他类继承的自定义类,您还可以创建一个返回descriptionDict的单独方法,然后在子类调用NSMutableDictionary *descriptionDict = [super descriptionDict]中继续添加/删除它的元素。

  

注意:我在每一行上使用if语句的原因是,如果一个对象恰好是nil,则抛出异常。当您尝试po对象时,这将导致“无法提供客观的c描述”。

但是要回答你的问题,没有秘密的方法可以让某些属性出现在描述中。你只需要自己构建一个字符串,无论你认为合适的是什么。

相关问题