2016-11-21 7 views
1

Objective Cでクラスを定義しましたが、そのインスタンス変数の1つが静的変数/クラス変数/グローバル変数のように動作しています。つまり、インスタンス変数がすでに初期化されていて、2番目のインスタンスで変数を変更すると、変数が実際にインスタンス変数でないかのように、最初のインスタンスも変更されます。ここでObjective Cのインスタンス変数が静的/クラス/グローバル変数のように動作するのはなぜですか?

は私のコードです:

#import <Foundation/Foundation.h> 

@interface MyObject : NSObject 
- (int)getValue; 
- (void)setValue:(int)aValue; 
@end 

@implementation MyObject 

int _value; 

- (int)getValue { 
    return _value; 
} 

- (void)setValue:(int)aValue { 
    _value = aValue; 
} 

@end 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    MyObject *myObject1 = [MyObject new]; 
    printf("myObject1 value before assignment: %d\n", [myObject1 getValue]); 
    [myObject1 setValue:1]; 
    printf("myObject1 value after assignment: %d\n", [myObject1 getValue]); 

    MyObject *myObject2 = [MyObject new]; 
    printf("myObject2 value before assignment: %d\n", [myObject2 getValue]); 
    [myObject2 setValue:2]; 
    printf("myObject2 value after assignment: %d\n", [myObject2 getValue]); 

    if (1 != [myObject1 getValue]) { 
     printf("ERROR: myObject1 value should be 1 after assignment of myObject2 value but is %d\n", [myObject1 getValue]); 
    } 

    [pool drain]; 
    return 0; 
} 

は、ここでそのエラーメッセージが発生したことを示す実行です:

myObject1 value before assignment: 0 
myObject1 value after assignment: 1 
myObject2 value before assignment: 1 
myObject2 value after assignment: 2 
ERROR: myObject1 value should be 1 after assignment of myObject2 value but is 2 

答えて

3

あなたがに応じて中括弧でそれをラップする必要があり、インスタンス変数として変数を定義するにはこの回答https://stackoverflow.com/a/13573236/2848676

補正これらの行に対して行われる必要がある:

@implementation MyObject 

int _value; 

インスタンス変数として_valueを定義するための正しい方法は次のようである:

@implementation MyObject { 

int _value; 

} 

これは正しい出力を生成

myObject1 value before assignment: 0 
myObject1 value after assignment: 1 
myObject2 value before assignment: 0 
myObject2 value after assignment: 2 

エラーは報告されていません。

+1

ここで少しわかりやすくするために、変数が 'static'変数として動作していた理由は、' @ implementation'中の変数を定義すると変数がインスタンス変数として追加されたからです。それ以外の場合は、適切な継続時間を持つ他のC変数として定義されます(この場合、デフォルトのルールではこの変数は 'static'です)。 @ int implementationの外側に 'int _value;'を置いた場合と同じです。 –

関連する問題