3

に表示したい2つのプロパティ-typeと-を持つオブジェクトがあります。すぐに使用できる説明は次のようになります。namedescription

<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のどこかのカテゴリに、説明に表示されるプロパティを指定するためにオーバーライドできるメソッドがある可能性がはるかに高いようです。誰かが実際に何が起こっているのか知っていますか?もしそうなら、それは私が利用できるものですか?

4

1 に答える 1

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各行でステートメントを使用する理由は、1 つのオブジェクトがたまたま である場合nil、例外がスローされるためです。これにより、オブジェクトを使用しようとしたときに「目的の c の説明がありません」と出力されpoます。

しかし、あなたの質問に答えるために、特定のプロパティを説明に表示させる秘密の方法はありません。適切だと判断した方法で、自分で文字列を作成する必要があります。

于 2012-12-20T22:29:17.063 に答える