オーバーライドされた記述メソッドでのオブジェクトのメモリアドレスのNSLog


116

オブジェクトの記述メソッドをオーバーライドしています。以下のコードでオブジェクトのメモリアドレスを印刷して{???}を置き換える方法を知る必要があります。

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %@>\nparmeterOne: %@\nparameterTwo: %@",
            {???}, self.parameterOne, self.paramterTwo];
}

私はそれを次のようにコンソールで印刷したいです:

<SomeClass: 0x4c05600> parameterOne: 12 parameterTwo: sausages

回答:


212

アドレスを出力するには、%pフォーマット指定子とセルフポインタを使用します。

-(NSString *) description {
    return [NSString stringWithFormat:@"<SomeClass: %p>\nparmeterOne: %@\nparameterTwo: %@",
            self, self.parameterOne, self.paramterTwo];
}

6
'%@'指定子でselfを使用すると、-descriptionメソッドが再度呼び出されるため、実際に再帰が発生します。%p指定子はポインタアドレスを出力するだけ
Vladimir

3
私は傾向があります[NSString stringWithFormat:@"%@ parameterOne:...", [super description], ...];—アドレスはそこにあるのでそこに終わりNSObjectますが、継承元のスーパークラスでのデバッグに関連すると判断したものを捨てることもありません。
Tommy

7
追記:%pタイプのポインタを想定しvoid *ているため、にキャストselfバックする必要がありvoid *ます。そうしないと、未定義の動作が発生します。

4
@ user529758:キャストする必要はなく、未定義の動作もありません。void *そしてid、内部はほぼ同じであり、あなたはそれをキャスト天気をこのケースでは違いはありませんvoid *か。
マイケル、

1
'&'記号を '自己'引数の前に置く必要があります
Artyom Devyatov

6

最も簡単な方法は、スーパー記述を使用することです

- (NSString *)description
{
    return [NSString stringWithFormat:@"%@ Area: %@, %@", [super description], self.identifier, self.name];
}

したがって、NSObjectのサブクラスであるこのモデルオブジェクトの場合、余分な作業を避けてを覚えておくことができます%p

NSStringWithClass()と%pを手動で使用する

- (NSString *)description
{
    return [NSString stringWithFormat:@"<%@: %p> Area: %@, %@", NSStringFromClass([self class]), self, self.identifier, self.name];
}

したがって、このクラスから派生した具象実装者がいるオブジェクトモデルの場合、正しいクラス名が表示されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.