假设我有这段代码:
@interface Foo : NSObject {
Bar *bar;
}
@property (retain, nonatomic) Bar *bar;
@end
使用此字段/属性时,行之间是否有任何区别:
[self.bar doStuff];
和
[bar doStuff];
在进行赋值时,属性方法将执行正确的保留,但如上所述,对属性的读访问权如何呢?有什么不同吗?
答案 0 :(得分:13)
有很大的不同。
[self.bar doStuff]
相当于[[self bar] doStuff]
[bar doStuff]
相当于[self->bar doStuff]
前者使用访问器方法,后者只是直接访问实例变量栏。
如果在@synthesize
属性上使用bar
指令,编译器将为您生成两种方法:
- (void)setBar:(Bar*)b;
- (Bar*)bar;
另请注意,编译器生成的setter方法保留了您在Bar
声明中告诉它的@property
实例。
答案 1 :(得分:2)
使用存取器self.bar转换为方法调用:[self bar]。句点语法仅适用于外观。直接访问成员变量不涉及额外的函数调用,因此稍快一些。它真的唯一的问题是你是在一个循环中访问它,还是在某个过程中,这种差异会加起来。 (在iPhone上)为属性创建的setter也有一些额外的开销来进行键值编码。当您调用“setBar:”或说“self.bar =”时会发送KVO通知,因此反复调用它会导致大量通知。
但是,Jim是对的 - 非原子@property和代码中直接使用变量之间没有功能差异。除非你真的关心速度,否则使用房产可能是你最好的选择。答案 2 :(得分:0)
合成(或正确手写)的非原子访问器在功能上等同于
- (Bar *)bar
{
return bar;
}
因此,您的两个示例之间没有功能差异。
但是,在-dealloc或您的初始化程序之外,始终通过其访问者访问该属性是一个好主意。
答案 3 :(得分:0)
如果使用方便的Bar类构造函数为您的字段赋值,则Bar字段将比具有Retain选项的Bar Property更快成为Zombie,因为引用计数不会通过分配字段而增加,有时您运行进入“访问deallocated objects”错误。