为什么我需要在objective-c中使用@property关键字?

时间:2016-08-29 13:58:30

标签: objective-c

假设我的班级有以下公共方法:

- (BOOL)finished
{
    return _finished;
}
- (void)setFinished:(BOOL)aValue
{
    _finished = aValue;
}

我是否还需要在课程中将finish设置为属性:

@property SomeClass *finished;

我可能误解了@property,但对我而言,我似乎在重复自己。

  • 应该声明这两种方法和@property还是其中一种?

2 个答案:

答案 0 :(得分:6)

通过声明@property,LLVM编译器将自动“合成”您的访问器方法(getter和setter),以及一个实例变量(ivar),用下划线前缀表示({例如{1}}

在你的情况下,因为你没有对你的访问者做任何特别的事情(你只是直接阅读/写入支持_finished),只需声明一个ivar即可。您无需编写@property-finished方法

如果您未声明-setFinished,则必须声明@property

ivar还表示您正在使用对象的成员变量,并且正如用户@Sulthan在评论中所说,每个类都包含可以搜索的@property列表

同一位用户@properties的另一个好处是制作了您的访问者方法@property,以保护您的atomic在被编写时不会被阅读

答案 1 :(得分:2)

即使有一个公认的答案,我认为必须添加一些信息和说明。

一个。 @property 合成任何内容。这是一个方法声明。期。这就是为什么它在协议中被允许的原因。 (不允许方法实现,甚至在协议中也不可能。)

让人们认为这是事实,如果您没有手动实现所有必需的访问者,编译器会在实现中隐式假设 @synthesize 并且合成了访问者。

但是,是的,隐式或显式@synthesize需要@property。 (但不是反过来!)

B中。如果明确定义了所需的访问者,则使用@property也必须声明一个ivar。这是因为隐式合成被关闭了#34;在这种情况下(有充分的理由)。

℃。除了方便之外,还有@property的真正优势:它为属性添加了语义信息。除了捆绑getter和setter(-setFinished:的什么是吸气剂?-isFinished-finished),它还包含有关复制和参考强度的信息(weakstrongcopy)。原子性不那么重要,因为在大多数情况下,访问的原子性无助于解决并发执行的问题。