2011年07月01日
【iOS SDK】グローバル変数の罠
うちで起こった現象です。
まったくもって、xcodeなりの仕様は調べてないので、うち特有の現象だか何だかは分かりませんので。あしからず。
iOS SDKのクラスで、グローバルな変数を使いたい(別のクラスからも利用したい)場合、
ヘッダーファイルに、@publicを付けるとできる。
例えば、int型のaという変数を別のクラスから利用する場合は、
ヘッダーファイル(.h)の@interfaceの中に、
@public int a;
と書く。
別のクラスから、このインスタンスobjのaを、bに代入するには、
int b = obj->a;
と書く。
書き込みもできます。
しかし、この変数は、cの関数からはアクセスできなかった。
例えば、上記aを、メインファイル(.m)内に定義した関数fから、
void f() {
int b = a;
}
とすると、エラーになる。
で、同じメインファイル(.m)内に、変数を宣言すると、cの関数からグローバルに使えるのだが。
先の@publicで宣言した変数とは別物になるっぽい。
int a;
void f1() {
a = 1;
}
-(void)f2 {
a = 2;
f1();
NSLog(@"%d", a);
}
このメソッドを呼び出すと、
[obj f2];
ログには、2が出力される。
まったくもって、xcodeなりの仕様は調べてないので、うち特有の現象だか何だかは分かりませんので。あしからず。
iOS SDKのクラスで、グローバルな変数を使いたい(別のクラスからも利用したい)場合、
ヘッダーファイルに、@publicを付けるとできる。
例えば、int型のaという変数を別のクラスから利用する場合は、
ヘッダーファイル(.h)の@interfaceの中に、
@public int a;
と書く。
別のクラスから、このインスタンスobjのaを、bに代入するには、
int b = obj->a;
と書く。
書き込みもできます。
しかし、この変数は、cの関数からはアクセスできなかった。
例えば、上記aを、メインファイル(.m)内に定義した関数fから、
void f() {
int b = a;
}
とすると、エラーになる。
で、同じメインファイル(.m)内に、変数を宣言すると、cの関数からグローバルに使えるのだが。
先の@publicで宣言した変数とは別物になるっぽい。
int a;
void f1() {
a = 1;
}
-(void)f2 {
a = 2;
f1();
NSLog(@"%d", a);
}
このメソッドを呼び出すと、
[obj f2];
ログには、2が出力される。
Posted by やま104 at 14:12│Comments(0)
│電算術