2017-09-23 2 views

答えて

1

someIntVariable@interfaceの外に定義されているため(これはここには含まれていません)、インスタンス変数ではありません。それはグローバルです。

そして、あなたはstaticキーワードを省略するので、それは彼らがそれを自分のextern参照を定義する必要があると思いますけれども、この変数は、他のコンパイル単位に技術的に利用可能であることを意味します

extern int someIntVariable; 

をあなたが望んでいた場合それを防ぐために、すなわち、この特定のコンパイル単位に、これはプライベート作る、あなたはSomeClass.msomeIntVariableの元の宣言でstaticキーワードが含まれると思います。

static int someIntVariable; 

このグローバル変数は@implementationの外部に定義しました。しかし、それが@implementationの内部にあったとしても、上記が当てはまることに注意する価値があります。

@implementation SomeClass 

int someIntVariable; 

- (void) foo { 
    someIntVariable = 0; 
} 

@end 

ボトムラインあなたは、静的たい場合、:それは@implementationの中にあった場合には(他のコンパイル単位はあなたの知識がなくても操作することができることを、グローバル変数ではなく、インスタンス変数)あなたの例とまったく同じ挙動を示します外部コンパイル単位では操作できないことを確認したければ、上記のようにstaticと宣言します。インスタンス変数が必要な場合は、@interfaceで明示的に宣言します(インスタンス変数を明示的に宣言するか、より一般的にはプロパティを宣言し、コンパイラにivarを合成させる)。

+1

もちろんOPがプライベートインスタンス変数を必要とする場合は、次のようにすることができます: '@implementation {int someInVariable}'。 – rmaddy

+0

うん、それも動作します。私は一般に私的なインスタンス変数をprivateクラスの拡張の '@ interface 'の中に定義していますが、' @ implementation'の中括弧の中にそれを含めています。 – Rob