2010-12-16 3 views
1

私はNSObjectの派生オブジェクトに対してObjective-Cの記述メソッドを実装しようとしています。Objective-Cの記述方法で説明の名前を持つivarを持つことはできませんか?

しかし、私の派生したオブジェクトは、名前の説明のivarを持っています。そして何らかの理由でこれがクラッシュを引き起こしています。

- (NSString *) description { 

    NSMutableString *output = [NSMutableString string]; 
    [output appendFormat:@"MyObject.description = %@\n", self.description]; 

    return output; 
} 

なぜこれが問題になるのですか?

答えて

5

短い答え:あなたの-description方法を繰り返し自分自身を呼び出すためクラッシュは、スタックオーバーフローの結果です。あなたがやりたいこと(説明方法の中からivarにアクセスする)を行うには、でなく、接頭辞を使用してください。self.はivarの前にあります。

詳細:Objective-Cでは

self.description[self description]の省略形です。ドット構文を使用すると、コンパイラはdescriptionという名前のプロパティにアクセスし、ではなくという名前のプロパティにアクセスすることを通知します。

+0

ありがとう、私は何か愚かなことをしていたことを知っていた。 – Shiun

+0

'this'?あなたが '自己'を意味すると思う;-)(これはC++のequiv、sortaですが)。 nm、あなたはそれを修正しました。 – NSGod

+0

@NSGod:すでに修正済みですが、それを指摘してくれてありがとう。私はいつもその間違いをしています。私はC++で歯を切ったので、 'これが自動的に飛び出す'): –

1

無限ループを作成しているので問題です。 self.descriptionは、[自己記述]を呼び出します。これはあなたが使っている方法とまったく同じです。したがって、メソッド自体を繰り返し呼び出すことができます。

- (NSString *) description { 

    NSMutableString *output = [NSMutableString string]; 
    [output appendFormat:@"super's description = %@\n", [super description]]; 
    [output appendFormat:@"MyObject.description = %@\n", description]; 

    return output; 
} 

self.descriptionではなく、インスタンス変数に直接アクセスできます。また、スーパーの記述メソッド(無限ループを作成しない)をどのように呼び出すことができるかを示すために余分な行を追加しました。

+0

ありがとう!それが問題です。私からの – Shiun

+0

+1。 '[super description]'の呼び出しに関する良い点 –

関連する問題