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