dポイントプレゼントキャンペーン実施中!

現在iPhoneアプリを作成するために、Objective-Cの勉強をしています。しかしそこでわからないことがあり、質問させていただきました。

それは私がインスタンス変数(メンバ変数)を宣言してつかっているつもりなのですが、クラス変数の様な動きをするのです。

具体的にコードで説明します。

@implementation Main : NSObject
- (void)hello{
[[Hoge alloc]init];
[[Hoge alloc]init];
}
@end


@implementation Hoge : NSObject
NSNumber *i;

- (id)init{
[super init];
NSLog(@"%d",i.intvalue);
i = [NSNumber numberWithInt:123];
return self;
}
@end

出力結果
null
123

今手元にソースがないので正確ではないかもしれませんが、こんな感じです。hファイルにはとくになにもかいてません。
このソースの動きはmainでHogeクラスのインスタンスを二回作成することによって、initを二回呼んでいます。

疑問点は出力結果の挙動が予想外なことです。私としてはインスタンス作成時のiは初期化されていないため、
出力結果
null
null
になるのを期待しています。しかし二回目のinitでは前回に作成した123というデータが引き継がれています。この挙動はiはインスタンス変数ではなく、クラス変数のようにみえます。
しかしObjective-Cではクラス変数は存在しないとどっかのサイトに書いていました。

以上が質問です。なにかお気づきになった点があればごかいとういただけると幸いです。

A 回答 (1件)

i はグローバル変数として宣言されています。



一度目の init 呼び出しのとき i はNULL(Objective-C的にはnil)ですが、
二度目では 一度目の NSLog のあとで i へ 123 が代入されていますので、
出力結果は 123 となります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!