リチャードが指摘したように、中括弧がないことで 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
場合、クラス拡張が役立ちます。