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

Ser*_*nov 11 objective-c

假设我有这段代码:

@interface Foo : NSObject {
    Bar *bar;
}

@property (retain, nonatomic) Bar *bar;

@end
Run Code Online (Sandbox Code Playgroud)

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

[self.bar doStuff];
Run Code Online (Sandbox Code Playgroud)

[bar doStuff];
Run Code Online (Sandbox Code Playgroud)

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

nsc*_*idt 13

有一个很大的不同. [self.bar doStuff]相当于[[self bar] doStuff]

[bar doStuff] 相当于 [self->bar doStuff]

前者使用访问器方法,后者只是直接访问实例变量栏.

如果@synthesizebar属性上使用该指令,编译器将为您生成两种方法:

- (void)setBar:(Bar*)b;
- (Bar*)bar;
Run Code Online (Sandbox Code Playgroud)

另请注意,编译器生成的setter方法保留了您Bar@property声明中告诉它的实例.

  • 好吧,可以.因为您可以以任何方式自由地实现方法栏.例如,您可以返回代理对象或其他任何内容.即使您合成了访问器方法,它们的行为也可能不同,例如,如果将属性设置为原子,则同步访问. (3认同)