【问题标题】:Internal properties versus ivars内部属性与 ivars
【发布时间】:2012-05-15 05:13:17
【问题描述】:

当我需要一个私有对象时,我目前使用属性,如下所示:

// Class extension in .m file
@interface MyClass()
@property (strong, nonatomic) NSArray* myInternalArray;
@end

self.myInternalArray = something; 

您也可以这样做:

@implementation MyClass {

    NSArray* _myInternalArray;
}

_myInternalArray = something;

如果没有自定义 setter 或 getter,两者是等价的。内部变量的最佳实践是什么?一种方法比另一种方法有什么优势吗?

【问题讨论】:

  • 有一个非常详细的答案可能对您有帮助,类似的问题。 It can be found here
  • 您的第一部分和第二部分不等价:在您的第一部分中,您创建了一个带有支持 ivar 的私有财产。因此,您可以使用 self.myInternalArray 或 _myInternalArray 等。但在您的第二部分中,没有属性。所以 self.myInternalArray 不起作用,但 _myInternalArray 会。

标签: iphone objective-c ios automatic-ref-counting


【解决方案1】:

虽然有些人可能会争辩说选择是一个偏好问题,而且他们确实有一点道理,但大多数现代语言都支持属性并使它们更容易和更容易编码是有充分理由的。

ARC 的引入并没有显着降低属性的价值。这一切都归结为 - 在一个属性中,您已经封装了一个变量的使用。这种封装在需要时是无价的,而在不需要时则没有太多开销。

例如(在我的脑海中)假设您发现您需要在保存之前验证该值。如果您使用的是 iVar,则必须确保在使用 iVar 的任何地方都调用了验证代码,然后才允许更改其值。使用属性,您只需要覆盖 setIVarName: 并将验证放在那里。有人可能会争辩说,一个与另一个一样简单——在许多情况下可能是这样,但这里 iVar 存在一个障碍——你不能确保未来的更改(由你或其他编码人员)会在之前插入验证iVar 已更改。在这里使用属性确实有这种保证。

就我个人而言,我尽可能使用 iVar 上的属性。

【讨论】:

  • 好点,我完全忘记了自定义设置器。您可能会争辩说它们的使用频率远低于外部属性,但我认为这是最佳实践。
【解决方案2】:

我想说属性的优点是您可以使用 setter,并且 setter 可以独立于调用它们的代码而发展。例如,您可以决定现在设置属性将触发 setNeedsLayout。通过从一开始就使用属性,您无需重构现有代码。

这种模式非常适合 Cocoa/iOS API,在这些 API 中,您不必要求系统对象在更改其属性后执行任何操作:setter 可立即确保内部和 UI 的一致性。

属性是私有的这一事实不应该让我们将它们实现为二等属性,你怎么看?

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2018-05-08
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多