これを変える:
@implementation MyClass
NSString *testVar;
@end
に:
@implementation MyClass {
NSString *testVar;
}
// methods go here
@end
そして、あなたはあなたが期待したものを手に入れるでしょう。
あなたがそれを持っていたように、あなたは実際にグローバル変数を作成しています。2つのグローバル変数はリンカーによって1つに結合されたため、1つを設定すると両方が変更されました。中括弧内の変数は、適切な(そしてプライベートな)インスタンス変数になります。
編集:明白な理由もなく反対票を投じられた後、私は物事の「古い」方法と新しい方法を指摘したいと思いました。
古い方法:
SomeClass.h
@interface SomeClass : UIViewController <UITextFieldDelegate> {
UITextField *_textField;
BOOL _someBool;
}
@property (nonatomic, assign) BOOL someBool;
// a few method declarations
@end
SomeClass.m
@implementation SomeClass
@synthesize someBool = _someBool;
// the method implementations
@end
現在、最新のObjective-Cコンパイラを使用した新しく改善された方法:
SomeClass.h
@interface SomeClass : UIViewController
@property (nonatomic, assign) BOOL someBool;
// a few method declarations
@end
SomeClass.m
@interface SomeClass () <UITextFieldDelegate>
@end
@implementation SomeClass {
UITextField *_textField;
}
// the method implementations
@end
新しい方法にはいくつかの利点があります。主な利点は、クラスに関する実装固有の詳細が.hファイルに表示されないことです。クライアントは、実装に必要なデリゲートを知る必要はありません。クライアントは、私が使用しているivarを知る必要はありません。これで、実装に新しいivarが必要な場合、または新しいプロトコルを使用する必要がある場合、.hファイルは変更されません。これは、再コンパイルされるコードが少なくなることを意味します。それはよりクリーンではるかに効率的です。また、編集が簡単になります。.mファイルを編集していて、新しいivarが必要であることに気付いたら、すでに編集しているのと同じ.mファイルに変更を加えます。前後に交換する必要はありません。
@synthesize
また、実装にはivarまたはプロパティが必要なくなったことにも注意してください。