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