シンプルなタブ付き iOS アプリを作成しています。それぞれ独自のView Controllerを備えた3つのタブがあります。各ビュー コントローラーで、同じ名前の変数を宣言します。
float nitriteLevel;
しかし、ある VC のナイトライト レベルの値を変更すると、他の VC のナイトライト レベルの値も変更されます。私が理解しているように、これはあってはならないことです。それらは完全に独立していて、無関係であるべきです。私は何を間違えたのでしょうか?
シンプルなタブ付き iOS アプリを作成しています。それぞれ独自のView Controllerを備えた3つのタブがあります。各ビュー コントローラーで、同じ名前の変数を宣言します。
float nitriteLevel;
しかし、ある VC のナイトライト レベルの値を変更すると、他の VC のナイトライト レベルの値も変更されます。私が理解しているように、これはあってはならないことです。それらは完全に独立していて、無関係であるべきです。私は何を間違えたのでしょうか?
実装セクションの途中で宣言しますか?または @... @end ブロックの外側でも?もしそうなら、あなたはそれをグローバルにしました。これが可能なのは、Objective-C の下に Ansi C があるためです。
プライベート インスタンス変数の場合は、次のようにします。 MyClassName.h ファイル:
@interface MyClassName : ItsSuperclassName <SomeProtocol> {
float nitriteLevel;
}
// if you want it private then there is no need to declare a property.
@end
MyClasseName.m ファイル:
@implementation
// These days there is no need to synthesize always each property.
// They can be auto-synthesized.
// However, it is not a property, cannot be synthesized and therefore there is no getter or setter.
-(void) someMehtod {
self->nitriteLevel = 0.0f; //This is how you access it.
float someValue2 = self->nitriteLevel; // That is fine.
self.nitriteLevel = 0.0f; // This does not even compile.
[self setNitriteLevel: 0.0f]; //Neither this works.
float someValue2 = self.nitriteLevel; // nope
float someValue3 = [self setNitriteLevel]; // no chance
}
@end
私は次の点について 100% 肯定的ではありません: このタイプの変数は自動的に初期化されていません。float nitriteLevel = 0.0f;
その時点でご利用いただけません。init メソッドで必ず初期化してください。スタイルに応じて、viewDidLoad (View Controllers) で最新のものを初期化します。