假设我的班级有以下公共方法:
- (BOOL)finished
{
return _finished;
}
- (void)setFinished:(BOOL)aValue
{
_finished = aValue;
}
我是否还需要在课程中将finish设置为属性:
@property SomeClass *finished;
我可能误解了@property
,但对我而言,我似乎在重复自己。
@property
还是其中一种?答案 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
),它还包含有关复制和参考强度的信息(weak
,strong
, copy
)。原子性不那么重要,因为在大多数情况下,访问的原子性无助于解决并发执行的问题。