4

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

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

self.myInternalArray = something; 

或者,您可以这样做:

@implementation MyClass {

    NSArray* _myInternalArray;
}

_myInternalArray = something;

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

4

2 回答 2

5

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

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

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

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

于 2012-05-06T10:06:30.040 回答
2

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

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

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

于 2012-05-06T10:05:11.430 回答