对象共享的实例变量?

时间:2012-11-29 05:46:01

标签: objective-c

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

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

这种奇怪的“分享”行为发生了什么?

2 个答案:

答案 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副本。