0

MyUnitClass私は次のように宣言された実装を持っています:

@implementation MyUnitClass
Unit* _unit = NULL;

for ループでは、何度も繰り返し、MyUnitClass の複数のインスタンスを作成しています。 Unit静的変数のように動作しています。の init メソッド内にブレークポイントを設定しています。MyUnitClassこれは、クラスが初期化されるたびに得られるものです。

(gdb) print _unit
$4 = (Unit *) 0x112340
(gdb) print _unit
$5 = (Unit *) 0x112340

ノート:

@interface変数を宣言に移動することで、すでに問題を解決しました。質問に答える場合は、この情報が見つかるページへのリンクが表示されると便利です。

4

2 に答える 2

8

これは、変数を中括弧で囲んでグローバルにしなかったためです。修正するには、次のように定義してみてください。

@implementation MyObject {
   unsigned int myVar;
}

// rest of implementation

@end

@implementation ブロックは 1 つしか存在できないため、.h ファイルで既に宣言されている場合は、そこにメンバーを追加するか、ブロック全体を .m ファイルに移動する必要があります。

これは C の残骸であり、コンパイラは、それをグローバルではなく iVar にしたいということをよく知りません。

于 2012-08-12T00:44:02.200 に答える
3

リチャードが指摘したように、中括弧がないことで var がグローバルとして定義されます。インスタンス変数の宣言に関しては、いくつかのアプローチがあります。

Objective-C プログラミング言語では、@interfaceまたはでのインスタンス変数の宣言についての議論があります@implementation

xしたがって、インスタンス変数は で定義できます@interface。これは、歴史的にインスタンス変数が定義されているのを目にする最も一般的な場所です。

@interface TestClass : NSObject
{
    NSInteger x;
}
@end

@implementation TestClass

// define the methods

@end

ただし、上記のリンクで説明されているように、次のように定義することもできます@implementation(ただし、慣例として、これを頻繁に目にすることはないと思います)。

@interface TestClass : NSObject

@end

@implementation TestClass
{
    NSInteger x;
}

// define the methods

@end

実際には、インスタンス変数を配置できる 3 番目の場所がクラス拡張にあります (同じドキュメントで後述します)。実際には、これは .h を次のように定義できることを意味します

// TestClass.h

@interface TestClass : NSObject

// define public properties and methods here

@end

そしてあなたの .m は次のとおりです:

// TestClass.m

// this is the class extension

@interface TestClass ()
{
    NSInteger x;
}
@end

// this is the implementation

@implementation TestClass

// define the methods

@end

この最後のアプローチ (.h に .h、@interfaceクラス拡張子に .m、および@implementation) は、新しいクラスを作成するときに Xcode テンプレートが使用する形式になりました。実際には、これは public 宣言を .h ファイルに入れ、private@property変数とインスタンス変数をクラス拡張に入れることができることを意味します。.h ファイル (実際には、クラスへのパブリック インターフェイス) がプライベートな実装の詳細で乱雑になるのを防ぐだけで、コードが少しきれいになります。インスタンス変数の場合、インスタンス変数を で定義する以前の手法はおそらく@implementation同等ですが、宣言では機能しないと思います。その@property場合、クラス拡張が役立ちます。

于 2012-08-12T07:23:43.800 に答える