こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Objective-C グローバル変数 値変更反映

当方、Objective-Cに関して1年にも満たない経験を持つ初心者です。
初歩的な内容だとは思いますが行き詰まってしまったため質問させて下さい。

複数の.hと.mファイルで定義された複数クラス間で一つの変数を共通で利用し、あるクラスのメソッド内で値を変更した際にそれ以外のクラスですぐに反映出来る様にしたいのですが、どの様に書いても値が反映されず初期値のまま出力されてしまいます。恐らく各クラス内のメソッドが呼ばれる順番に起因すると思うのですが、上手く解決出来ません。


現在書いているコードとして、

-xxxAppDelegate.h

(at)interface xxxAppDelegate : NSObject <UIApplicationDelegate> {
...
int globalNum;
}
(at)property(nonatomic, assign)int globalNum;
(at)end


-xxxAppDelegate.m
...
(at)implementation xxxAppDelegate
(at)synthesize globalNum;
...
(at)end



-A.h
...
(at)interface AController : UIViewController {
xxxAppDelegate *appDelegate;
}
...
-(void)changeNum;
-(IBAction)changeController;
(at)end



-A.m
...
(at)implementation AController
...
- init(){
appDelegate = (xxxAppDelegate *)[[UIApplication sharedApplication] delegate];
}
...
-(void)changeNum{
//ここでglobalNumの値を変更;
appDelegate.globalNum=...;
}
...
//配置したボタンを押すとA->BにviewControllerを切り替える
-(IBAction)changeController{
BController *B = [[BController alloc] initWithNibName:(at)"BController" bundle:nil];
B.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:B animated:YES];
[B release];
}
...
(at)end


-B.h
...
(at)interface BController : UIViewController {
xxxAppDelegate *appDelegate;
}
...
-(void)readNum;
(at)end



-B.m
...
(at)implementation BController
...
- init(){
appDelegate = (xxxAppDelegate *)[[UIApplication sharedApplication] delegate];
}
...
-(void)readNum{
//globalNumの値を見る;
NSLog((at)"%d" , appDelegate.globalNum);
}
...
(at)end


となっています。( (at)=アットマークです。 )

xxxAppDelegateおよびxxxViewControllerよりAControllerを呼び出し、AクラスのchangeNumメソッドでglobalNumの値を変更した後、ボタンを押下してviewControllerをBControllerに切り替え、Bクラス内のreadNumメソッドでglobalNumの値を確認すると、変更が反映されていない事が分かります。

この方法以外にも色々と試してみたのですが、すっきりとしたコードが書けず、解決に至りませんでした。
申し訳ありませんが、皆さんの知恵をお貸し下さい。
よろしくお願いします。

投稿日時 - 2011-03-27 19:50:49

QNo.6625185

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

解決しているかもしれませんが。

あまり賢い方法ではないですが、NSUserDefaultsクラスを使ってみてはいかがでしょう?

投稿日時 - 2011-05-18 10:33:35

ANo.3

> ※(1)(2)について
> 流石にそれぐらいは分かってます.....
> それを理解した上で質問しているのですが.....

わかっていたら、こんなコードは書きません。
あなたの理解は間違っています。

> ※「@」について
> 質問の投稿内容に「@」を付けると著作権問題となりOKWaveのサポートセンターで確認した後に公表されるそうなので、あえて外しました。

なるほど、かつてじぶんが回答した質問が、問題ありとなって、アクセス不可になったことがありましたが、そういうことだったのですか。勉強になりました。

投稿日時 - 2011-03-27 21:59:54

お礼

>わかっていたら、こんなコードは書きません。
>あなたの理解は間違っています。

どうも重大な誤解を抱えたままコードを記述しているようですね......
理解を間違えてる、と言われてしまっては何も言えません。
反省します。


ご回答ありがとうございました。

投稿日時 - 2011-03-27 22:33:43

ANo.2

再勉強の一助として、書き記しておくならば……

(1) クラスとインスタンス(オブジェクト)の違いを、判別できるようになる。

クラスを「alloc」すると、新しいインスタンスが生成されます。既存のインスタンスとは別のインスタンスです。

(2) インスタンスは、メモリ上にバッファされている。

バッファされる前のインスタンスにアクセスすると、エラーになりますし、バッファが開放されたインスタンスにアクセスしても、エラーになります。インスタンスにアクセスする前に、かならずインスタンスがバッファされているか、確認するコードが必要です。

※「@」。アットマークは、ちゃんと入力できますよ。

投稿日時 - 2011-03-27 21:28:54

お礼

お早い御返事ありがとうございます。

※(1)(2)について
流石にそれぐらいは分かってます.....
それを理解した上で質問しているのですが.....


※「@」について
質問の投稿内容に「@」を付けると著作権問題となりOKWaveのサポートセンターで確認した後に公表されるそうなので、あえて外しました。


とは言え、Objective-Cについて十分な勉強を行っていないのも事実ですので、一から勉強し直したいと思います。


回答ありがとうございました。

投稿日時 - 2011-03-27 21:44:47

ANo.1

まったく、あさっての方向を向いている……

としか回答しようがありません。
もういちど初歩からObjective-Cの勉強をし直してください。

投稿日時 - 2011-03-27 20:38:36

あなたにオススメの質問