在我关注的教程中,它创建了一个像这样的数组的属性
@property (nonatomic, retain) NSMutableArray *entries;
在实现文件中定义它将其定义为...
entries = [[NSMutableArray alloc] init];
但是在我的程序中,这样定义会给我一个错误
“使用未声明的标识符'条目';您的意思是'_entries'吗?”
这会影响我的程序吗?
答案 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
(或retain
)copy
assign
atomic
制作的,例如assign
将值复制到变量atomic
确保如果从不同的线程一起调用setter和getter,getter总是在setter开始之前或者在setter完成之后获取值。