2009-10-14 11 views
5

私はスーパークラスとサブクラスを持っています。どちらもインスタンス変数を定義しています。スーパークラスのObjective-C:デバッガのスコープ外のインスタンス変数

ラフ概要:サブクラスの

/* GenericClass.h */ 
@interface GenericClass : NSObject { 
    /* some variables */ 
} 
@end 
/* GenericClass.m */ 
@implementation GenericClass 
    /* ... */ 
@end 

概要:

/* SpecificClass.h */ 
#import "GenericClass.h" 
@interface SpecificClass : GenericClass { 
    NSMutableString *str; 
} 
/* SpecificClass.m */ 
#import "SpecificClass.h" 
@implementation SpecificClass 
- (void)aMethod { 
    //Debugger reports str as out of scope 
    str = [[NSMutableString alloc] initWithCapacity:100]; 
    //Works fine: 
    self->str = [[NSMutableString alloc] initWithCapacity:100]; 
    //Doesn't compile as I haven't defined @property/@synthesize: 
    self.str = [[NSMutableString alloc] initWithCapacity:100]; 
} 

私はNSObjectのから直接継承するクラスを使用しています、1は自己>のポインタを必要としません。親GenericClassにstrという名前のオブジェクトが定義されていないことに注意してください。 私の質問は、なぜstrがself-> strとして参照されていないときにスコープから外れているのでしょうか?コード自体は機能しますが、デバッガで変数を読み取ることができません

答えて

7

GDBはObjective-Cコンパイラではありません。コンパイラは、Objective-Cメソッド内のレキシカルスコープのようなものを知っていますが、GDBはそうではありません。ただし、ローカル変数については理解しています。

Objective-Cでは、すべてのメソッドに暗黙的にselfパラメータが渡されます。したがって、self->strを見ると、GDBは他のローカル変数評価を解釈するように解釈しています。

strを単独で評価しようとすると、GDBはstrという名前のローカル変数を探し、スコープにないことを報告します。これはエラーではありません。これは予想される動作です。

+0

これは、GDBがどのように動作するかを明確にしたものです。しかし、まだ私を混乱させる1つのことがあります。私はスーパークラスで定義された変数を持っています。 1つのNSMutableString * superstrを呼び出してみましょう。 SpecificClassの実装でそれ自身の "superstr"への参照はうまくいきます。しかし、SpecificClass.hで定義された変数 "str"にアクセスしようとすると、self->を使用しないとデバッガでは機能しません。どのようにGDBは継承された変数を見つけますが、このクラスのヘッダに定義されている変数は見つけられませんか?私が継承を使用していない場合、これは正常に動作します。 XCodeのバグのようです。 –

+1

デバッガコンソールウィンドウ(⇧⌘R)で 'po str'と' po superstr'を試してみてください。それらの結果が同じ場合、問題はXcode(これはおそらく)とは関係ありません。 –

+1

奇妙なことに、po strとpo superstrはコンソールでうまく動作し、po self - > strとpo self - > superstrのように動作します。視覚的なデバッグUIでのみ、マウスで移動したときにself-> reportがスコープ外にあるstr変数がありますが、コードの読み書き操作はうまく動作します。私はAppleにバグとしてそれを記録するでしょう。私は視覚的にデバッグできるように、私はどこにでもself->を使っています(私はそうしたくないですが)。 –

関連する問題