假设我有这段代码:
@interface Foo : NSObject {
Bar *bar;
}
@property (retain, nonatomic) Bar *bar;
@end
使用此字段或属性时,以下两种方式有什么区别:
[self.bar doStuff];
而且
[bar doStuff];
在进行赋值操作时,属性方法会执行正确的保留(retaining)操作,但是在读取属性时是否也存在上述区别呢?
假设我有这段代码:
@interface Foo : NSObject {
Bar *bar;
}
@property (retain, nonatomic) Bar *bar;
@end
使用此字段或属性时,以下两种方式有什么区别:
[self.bar doStuff];
而且
[bar doStuff];
在进行赋值操作时,属性方法会执行正确的保留(retaining)操作,但是在读取属性时是否也存在上述区别呢?
有很大的区别。
[self.bar doStuff]
相当于 [[self bar] doStuff]
[bar doStuff]
相当于 [self->bar doStuff]
前者使用访问器方法,后者直接访问实例变量 bar。
如果在你的 bar
属性上使用 @synthesize
指令,编译器将为您生成两个方法:
- (void)setBar:(Bar*)b;
- (Bar*)bar;
请注意,编译器生成的setter方法会按照你在@property
声明中告诉它的方式保留你的Bar
实例。
- (Bar *)bar
{
return bar;
}
所以在你的两个示例之间没有功能上的区别。
然而,在-dealloc或者初始化器之外,通过其访问器来一致地访问属性是一个好主意。