【问题标题】:Using a BOOL property使用 BOOL 属性
【发布时间】:2011-06-19 08:27:07
【问题描述】:

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

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

由于我使用的是 Objective-C 2.0 属性和点符号,因此我使用 self.working 访问此属性。我知道我也可以使用 [self isWorking] — 但我不必这样做。

那么,既然我到处都在使用点符号,我为什么要定义一个额外的属性呢?可以简单写吗

@property (nonatomic, assign) BOOL working;

或者我写getter=isWorking 有什么好处(使用点符号)?

谢谢!

【问题讨论】:

  • 这不是基于语义的推荐吗?所以 myCar.isWorking 在语义上会比 myCar.working 更准确

标签: objective-c ios properties


【解决方案1】:

Apple 仅建议出于文体目的声明 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

【讨论】:

  • 肯定它更多地与键值编码兼容而不仅仅是风格目的?
  • 苹果推荐声明那些isX getter 但Xcode能够在自动完成弹出窗口中列出它们有点奇怪。 (在我的例子中)working 在那里列出,但isWorking 没有。因此,我认为声明 BOOL 吸气剂没有任何好处。我必须做更多才能使用它们(声明 getter)但我得到的更少(没有自动完成)。
【解决方案2】:

Apple 建议出于文体目的。如果您编写此代码:

@property (nonatomic,assign) BOOL working;

那么你不能使用[object isWorking]。
它会显示一个错误。但是如果你使用下面的代码意味着

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 你没有回答他的问题,即明确命名 getter 的目的是什么而不是属性(他不是问属性是否是一个好主意)。此外,属性允许 KVO 和 KVC,因此您提出的观点具有误导性。
    • 你说得对,我忽略了 KVO 和 KVC 与原始属性的使用。我认为线程中的每个人都在解决他关于 isWorking 的问题 - 这是一个命名约定。
    • 这是完全错误的; @property 非常适合与原始类型一起使用,仅出于一致性的考虑,它具有显着的优势。此外,一些原始类型(一些 32 位 CPU 上的 64 位类型和许多 32 位和 64 位 CPU 上的 128 位类型)在分配时是非原子的; @property 的原子性在这些情况下也很有优势。
    • 很有趣——但我怎么会知道呢? :) 这是atomicnonatomic 属性的隐含属性吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多