我声明了一个实例变量(不是静态的),只是 @implementation 部分中的一个常规变量。当我从几个对象访问该变量时,似乎所有对象都共享同一个变量,就好像我已将其声明为静态一样!
然后我将实例变量更改为(强)属性(在 .m 文件中定义以使其成为私有),它开始按预期工作,每个对象都有自己单独的属性版本。
这种奇怪的“分享”行为是怎么回事?
我声明了一个实例变量(不是静态的),只是 @implementation 部分中的一个常规变量。当我从几个对象访问该变量时,似乎所有对象都共享同一个变量,就好像我已将其声明为静态一样!
然后我将实例变量更改为(强)属性(在 .m 文件中定义以使其成为私有),它开始按预期工作,每个对象都有自己单独的属性版本。
这种奇怪的“分享”行为是怎么回事?
您没有声明实例变量。您定义了一个全局变量。你这样做了:
@implementation MyObject
int myVariable;
但你应该这样做:
@implementation MyObject {
int myVariable;
}
在 @implementation 中定义常规 var 时,您定义了一个全局变量。例如,在 am 中,您定义:
@implementation classA
int tryMe = 99;
然后在 bm 中,您也使用 tryMe:
@implementation classB
-(void) func {
extern int tryMe;
NSLog(@"%i", tryMe); // This will print 99.
}
但是如果你在 am 中使用“static”,那么你会得到构建错误,你会被告知找不到“tryMe”。因为“静态”使变量成为定义变量的文件的本地变量。
同时,如果将 var 定义为属性,则 var 是类的成员,因此类的每个实例都有自己的 var 副本。