我有一个包含两个属性的对象 - type
和name
- 我希望在其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的某个类别中有一些方法可以被覆盖以指定描述中显示哪些属性。有谁知道真正发生了什么,如果是的话,我可以利用它吗?
答案 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描述”。
但是要回答你的问题,没有秘密的方法可以让某些属性出现在描述中。你只需要自己构建一个字符串,无论你认为合适的是什么。