当我需要一个私有对象时,我通常使用属性,如下所示:
// Class extension in .m file
@interface MyClass()
@property (strong, nonatomic) NSArray* myInternalArray;
@end
self.myInternalArray = something; 或者,您可以执行以下操作:
@implementation MyClass {
NSArray* _myInternalArray;
}
_myInternalArray = something;如果没有自定义setter或getter,这两种方法是等效的。内部变量的最佳实践是什么?其中一种方法比另一种方法有什么优势吗?
发布于 2012-05-06 18:06:30
虽然有些人可能会争辩说,选择是一个偏好问题,但他们确实有一个很好的理由,即大多数现代语言支持属性,并使它们更容易编码。
ARC的引入不会显著降低属性的价值。这一切都归结为这一点-在一个属性中,你封装了一个变量的使用。这种封装在需要时是无价的,而在不需要时不会产生太多开销。
例如(在我的脑海中)假设你发现你需要在保存之前验证值。如果您使用的是iVar,则必须确保在使用该iVar的任何地方,都调用了验证代码,然后才允许更改它的值。有了属性,您只需要覆盖setIVarName:并将验证放在那里。有人可能会争辩说,一个和另一个一样简单-这在许多情况下可能是真的,但这里iVar有一个障碍-您不能确保将来的更改(由您或其他程序员进行)会在iVar更改之前插入验证。在这里使用属性确实有这样的保证。
就我个人而言,只要有可能,我就会在iVars上使用属性。
发布于 2012-05-06 18:05:11
我要说的是,属性的优点是您可以使用setter,并且setter可以独立于调用它们的代码而发展。例如,您可以决定现在设置一个属性将触发setNeedsLayout。通过从一开始就使用属性,您将不需要重构现有代码。
这种模式非常适合Cocoa/iOS API,在这些API中,您不必要求系统对象在更改其属性后执行任何操作:setter可立即确保内部和UI的一致性。
事实上,属性是私有的,这不应该让我们将它们实现为第二类属性,您认为呢?
https://stackoverflow.com/questions/10469488
复制相似问题