@implementationセクションで通常の変数であるインスタンス変数(静的ではない)を宣言しました。複数のオブジェクトからその変数にアクセスすると、静的に宣言したかのように、すべてのオブジェクトが同じ変数を共有しているように見えました。
次に、インスタンス変数を(強力な)プロパティ(.mファイルでプライベートにするために定義)に変更すると、期待どおりに機能し始め、各オブジェクトが独自のバージョンのプロパティを取得しました。
その奇妙な「共有」動作で何が起こっていたのでしょうか。
@implementationセクションで通常の変数であるインスタンス変数(静的ではない)を宣言しました。複数のオブジェクトからその変数にアクセスすると、静的に宣言したかのように、すべてのオブジェクトが同じ変数を共有しているように見えました。
次に、インスタンス変数を(強力な)プロパティ(.mファイルでプライベートにするために定義)に変更すると、期待どおりに機能し始め、各オブジェクトが独自のバージョンのプロパティを取得しました。
その奇妙な「共有」動作で何が起こっていたのでしょうか。
インスタンス変数を宣言していません。グローバル変数を定義しました。あなたはこれをしました:
@implementation MyObject
int myVariable;
しかし、あなたはこれを行うべきでした:
@implementation MyObject {
int myVariable;
}
@implementationで通常の変数を定義するときは、グローバル変数を定義します。たとえば、午前では、次のように定義します。
@implementation classA
int tryMe = 99;
次に、bmでは、tryMeも使用します。
@implementation classB
-(void) func {
extern int tryMe;
NSLog(@"%i", tryMe); // This will print 99.
}
ただし、午前中に「static」を使用すると、ビルドエラーが発生し、「tryMe」が見つからなかったことが通知されます。「静的」であるため、変数を変数を定義するファイルに対してローカルにします。
一方、varをプロパティとして定義すると、varはクラスのメンバーになるため、クラスの各インスタンスにはvarの独自のコピーがあります。