0

我声明了一个实例变量(不是静态的),只是 @implementation 部分中的一个常规变量。当我从几个对象访问该变量时,似乎所有对象都共享同一个变量,就好像我已将其声明为静态一样!

然后我将实例变量更改为(强)属性(在 .m 文件中定义以使其成为私有),它开始按预期工作,每个对象都有自己单独的属性版本。

这种奇怪的“分享”行为是怎么回事?

4

2 回答 2

3

您没有声明实例变量。您定义了一个全局变量。你这样做了:

@implementation MyObject

int myVariable;

但你应该这样做:

@implementation MyObject {
    int myVariable;
}
于 2012-11-29T05:57:49.703 回答
1

在 @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 副本。

于 2012-11-29T06:01:02.547 回答