访问属性方法和类字段之间的区别(Objective-C)

时间:2009-07-04 14:16:39

标签: objective-c

假设我有这段代码:

@interface Foo : NSObject {
    Bar *bar;
}

@property (retain, nonatomic) Bar *bar;

@end

使用此字段/属性时,行之间是否有任何区别:

[self.bar doStuff];

[bar doStuff];

在进行赋值时,属性方法将执行正确的保留,但如上所述,对属性的读访问权如何呢?有什么不同吗?

4 个答案:

答案 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”错误。