【问题标题】:How do apple's objects show properties in their description, and can I do the same?苹果的对象如何在其描述中显示属性,我可以这样做吗?
【发布时间】:2012-10-20 17:25:08
【问题描述】:

我有一个具有两个属性的对象 - 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>

到目前为止,一切都很好。但是苹果的对象有动态描述;如果我查看视图的描述,我会得到以下信息:

<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 的某个类别中的某个类别中有一些方法可以被覆盖以指定在描述中显示哪些属性。有谁知道到底发生了什么,如果知道,我可以利用它吗?

【问题讨论】:

    标签: objective-c


    【解决方案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 描述”。

    但要回答您的问题,没有秘密方法可以让某些属性出现在描述中。您只需要自己构建一个字符串,无论您决定采用何种合适的方式。

    【讨论】:

    • 谢谢。这确实是我在问题中提到的“大量 if 语句”方法。
    • @Simon 解决这个问题的唯一方法是创建一个方法,该方法接受一个键数组,检查它们是否被分配,并返回它们的值。也就是说,您有一个数组,而不是“大量的 if 语句”,您可以迭代并使用键值观察来只有一个“if”语句。
    • @Simon 但是,这似乎比必要的复杂。例如,请参阅stackoverflow.com/questions/4874288/… 使用 KVO 获取 UIView 框架的值。
    猜你喜欢
    • 2016-08-04
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多