使用BOOL属性


110

苹果建议以这种方式声明BOOL属性:

@property (nonatomic, assign, getter=isWorking) BOOL working;

在使用Objective-C 2.0属性和点表示法时,我使用来访问此属性self.working。我知道我也可以使用[self isWorking]-但我不必这样做。

因此,当我到处都使用点表示法时,为什么还要定义一个额外的属性?简单地写可以吗

@property (nonatomic, assign) BOOL working;

还是getter=isWorking在我的案例中有写任何好处(使用点符号)?

谢谢!


4
这不是基于语义的推荐吗?因此myCar.isWorking在语义上将比myCar.working更准确
只需

Answers:


205

Apple仅建议isX出于样式目的声明一个吸气剂。只要您使用正确的名称的点表示法或消息表示法,是否自定义吸气剂名称都没有关系。如果要使用点号,则没有区别,仍然可以通过属性名称访问它:

@property (nonatomic, assign) BOOL working;

[self setWorking:YES];         // Or self.working = YES;
BOOL working = [self working]; // Or = self.working;

要么

@property (nonatomic, assign, getter=isWorking) BOOL working;

[self setWorking:YES];           // Or self.working = YES;, same as above
BOOL working = [self isWorking]; // Or = self.working;, also same as above

4
当然,它与键值编码的兼容还不仅仅是样式目的?
Jasarien

5
Apple 建议声明这些isXgetter 有点奇怪,但是Xcode 不能在自动完成弹出窗口中列出它们。(在我的示例中)working列出了,但isWorking没有列出。因此,声明BOOL getters没有任何好处。我必须做更多的事情才能使用它们(声明吸气剂),但得到的却更少(没有自动补全)。
帕特里克

4

Apple建议出于样式目的使用。如果您编写此代码,请执行以下操作:

@property (nonatomic,assign) BOOL working;

这样就不能使用[object isWorking]。
它将显示一个错误。但是,如果您使用以下代码表示

@property (assign,getter=isWorking) BOOL working;

因此,您可以使用[object isWorking]。


-26

使用带有原始类型的属性没有任何好处。 @property使用与分配的堆NSObjectsNSString*NSNumber*UIButton*,和等,因为内存管理访问器免费创建。创建时BOOL,该值始终分配在堆栈上,并且不需要任何特殊的访问器即可防止内存泄漏。 isWorking只是表达布尔值状态的流行方法。

在另一种OO语言中,您将创建一个变量private bool working;和两个访问器:SetWorking用于setter和IsWorking访问器。


1
您没有回答他的问题,即明确将getter命名为属性以外的其他东西的目的是什么(他不是在问属性是否是个好主意)。而且,属性允许使用KVO和KVC,因此您所做的观点具有误导性。
Martin Gjaldbaek

没错,我忽略了将KVO和KVC与原始属性一起使用。我认为线程中的每个人都在解决有关isWork的问题-这是一个命名约定。
汤姆森·科默

25
这是完全不正确的。 @property非常适合与原始类型一起使用,并且仅出于一致性考虑,它具有明显的优势。此外,某些原始类型(某些32位CPU上的64位类型和许多32位和64位CPU上的128位类型)在分配时是非原子的。 @property在这些情况下,的原子性也可能是有利的。
bbum 2011年

1
有趣-但是我应该怎么知道呢?:)这是atomicnonatomic属性的隐式表示吗?
汤姆森·科默
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.