objective-c中有和没有下划线的变量之间的差异

时间:2013-11-30 11:57:16

标签: objective-c

在我关注的教程中,它创建了一个像这样的数组的属性

@property (nonatomic, retain) NSMutableArray *entries;

在实现文件中定义它将其定义为...

 entries = [[NSMutableArray alloc] init];

但是在我的程序中,这样定义会给我一个错误

“使用未声明的标识符'条目';您的意思是'_entries'吗?”

这会影响我的程序吗?

3 个答案:

答案 0 :(得分:2)

简单来说:

@property (nonatomic, retain) NSMutableArray *entries;

为您创建以下代码:

名为_entries的ivar和两种方法

- (void)setEntries:(NSMutableArray *)entries;
- (NSMutableArray *)entries;

如果你想给ivar一个不同的名字(例如entries没有下划线),你必须合成它们。但你几乎不需要实际的,只需使用你的属性,如self.entries

您实际需要ivar的极少数情况是您想要覆盖setter和getter方法

- (void)setEntries:(NSMutableArray *)entries
{
    _entries = entries;
    // do more stuff
}

答案 1 :(得分:0)

当您声明属性编译器创建私有变量时,您可以使用下划线(_entries)访问它,并且compilator也会创建setter(如果您不指定readonly)和getter。你可以用两种方式调用getter:

[self entries] or self.entries

声明属性时,您应该以两种方式访问​​:

_entries - 您可以直接访问您的私有变量(可以在类中使用)

self.entries - 您可以安全地访问此属性视图setter / getter,因为此方法管理如何访问它(释放,保留,复制等)

答案 2 :(得分:0)

@property (nonatomic, retain) NSMutableArray *entries;只不过是名为_entries的实例变量。 (或者在进行合成时可以指定的任何其他名称)

执行@synthesize entries时,会为您创建两种存取方法(setter和getter) - (void)setEntries:(NSMutableArray *)entries;
- (NSMutableArray *)entries;

如果您直接以_entries访问它,那么它只是更改变量的值。 但是如果你说self.entries,就会调用accessor方法。访问者方法是根据您指定的属性类型strong(或retaincopy assign atomic制作的,例如assign将值复制到变量atomic确保如果从不同的线程一起调用setter和getter,getter总是在setter开始之前或者在setter完成之后获取值。