2

我在 .h 文件的接口方法中定义了一个变量,如下所示......

@interface ......{
  int a;
}

然后我在 .m 文件中使用它,它工作正常....

我也将代码修改为

@interface ......{
  int a;
}
@property(nonatomic) int a;

在 .h 文件中,在 .m 文件中,我将 int 值设置为

@synthesize a;

现在它也工作正常......

两种情况有什么不同?

4

4 回答 4

2

在第一种情况下,您使用字段,可以直接访问它。在第二种情况下,您正在使用访问器定义 Objective C 属性。

于 2011-01-10T11:46:05.600 回答
1

通过声明您的“a”属性,您允许将 int 存储在您的类中,并且您可以从您的类中访问它 - 但只能在您的类中。如果您希望它成为其他对象可以访问的属性(公共属性),那么您需要 getter 和 setter 方法。

通过在 your 中将其声明为 a并在@propertyyour 中.h使用,您将自动创建两种方法:@synthesize.m

[myObject a]; // your getter
[myObject setA:50]; // your setter

这里要记住的一件事是,即使在您的类中使用综合属性通常也是一个非常好的主意,因为它们会处理您的内存管理。例如,当您将 as 标记@propertyretain

objectProperty = anObject; // just accessing locally, no memory management
self.objectProperty = anObject; // [anObject retain] will be called
self.objectProperty = nil; // [anObject release] will be called
于 2011-01-10T05:10:19.293 回答
0

如果您定义和综合一个属性,那么您还可以使用 访问该值int value = self.a; self.a = newValue;。这也使得其他对象可以访问该变量。如果没有该属性,您将无法使用self.来获取变量,并且其他对象也无法自动获取该变量。

于 2011-01-10T05:02:40.330 回答
0

当您定义和合成一个属性时,您告诉编译器为它生成 ivar 和访问器方法(-(int)a; 和 -(void)setA:(int)a_;)。这些方法可以使用点语法显式或隐式调用:

self.a = num; // [self setA:num] gets called 
于 2011-01-10T05:03:01.923 回答