使用BOOL属性

112

苹果公司建议这样声明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在语义上更加准确。 - justcompile
3个回答

212

为了符合代码风格,苹果公司建议声明一个isX getter。无论你是否自定义getter名称,只要你使用正确的点表示法或消息表示法,都不会有影响。如果你使用点表示法,仍然通过属性名访问,不会有任何区别。

@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
苹果公司建议声明那些isX的属性,但是Xcode无法在自动补全弹出窗口中列出它们,这有点奇怪。在我的示例中,working被列在那里,但是isWorking没有被列出。因此,我认为声明BOOL类型的getter没有任何好处。我需要做更多的工作来使用它们(即声明getter),但我得到的却很少(没有自动补全)。 - Patrick

4
苹果公司建议出于风格考虑。如果您编写以下代码:
@property (nonatomic,assign) BOOL working;

那么您就不能使用 [object isWorking]。
这将显示一个错误。但是,如果您使用以下代码,则意味着:

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

所以你可以使用 [object isWorking]。

-27

使用原始类型的属性没有任何好处。 @property 用于堆分配的 NSObjects,如 NSString*NSNumber*UIButton* 等,因为可以免费创建内存管理访问器。当您创建一个 BOOL 时,该值总是在堆栈上分配,并且不需要任何特殊的访问器来防止内存泄漏。 isWorking 只是表达布尔值状态的流行方式。

在另一种面向对象语言中,您会创建一个变量 private bool working; 和两个访问器:SetWorking 用于设置器和 IsWorking 用于访问器。


1
你没有回答他的问题,即明确将getter命名为属性之外的其他名称的目的是什么(他并不是在问属性是否是一个好主意)。此外,属性允许KVO和KVC,所以你所做的观点是误导的。 - Martin Gjaldbaek
你说得对,我确实忽略了使用KVO和KVC处理原始属性的问题。我认为线程中的每个人都在回答他关于isWorking的问题 - 这是一种命名约定。 - Thomson Comer
26
这是完全错误的; @property 完全可以用于基本数据类型,并且仅出于一致性考虑,就具有显著的优势。此外,一些基本数据类型(在某些 32 位 CPU 上为 64 位类型,在许多 32 位和 64 位 CPU 上为 128 位类型)在赋值时是非原子的; 在这些情况下, @ property 的原子性也可能是有利的。 - bbum
1
有趣 - 但我该怎么知道呢? :) 这是 atomicnonatomic 属性的隐含吗? - Thomson Comer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接