在现代Objective-C编码中,是否应将ivar替换为属性声明作为最佳实践?

时间:2013-11-22 14:05:00

标签: objective-c properties

我正在重构旧代码并且想知道 - 随着自动合成属性和类扩展的出现,大多数实例变量声明是否应该以属性的形式作为最佳实践来完成?

2 个答案:

答案 0 :(得分:0)

是的,最佳做法是在接口文件或实现文件类扩展中使用属性,因为属性是设计为公共或私有的属性。

答案 1 :(得分:0)

这取决于你的编码风格。通常,将您希望其他类可访问的ivars作为.h文件中的属性。

如果声明属性但将@synthesize留给编译器,它们将自动合成,以便属性myInstanceVariable在内部被称为_myInstanceVariable

直接访问_myInstanceVariable意味着您将绕过类内部有时需要的任何setter / getter,尤其是当getter创建一个对象时。

然而,通常当我有内部简单的ivars不需要任何setter / getter时,我会直接在类扩展中使用ivars:

// MyClass.m

#import MyClass.h

@interface MyClass() {
    BOOL _simpleInternalVariable;
    NSUInteger _anotherSimpleInternalVariable;
}

@end

@implementation MyClass

- (void)someMethod
{
    _simpleInternalVariable = YES;
    _anotherSimpleInternalVariable = 4;
}

@end

这产生与@property BOOL simpleInternalVariable;完全相同的结果,除了您确定编译器不会自动创建setter / getter。我有时喜欢这种方式,因为你不能写self.simpleInternalVariable。编写self.ivar意味着getter在某个地方运行,但你并不总是知道它是自定义getter还是合成getter。在写_ivar时,我总是知道我正在直接处理ivar。

对于对象,我总是在.h-和.m-文件中使用属性。从理论上讲,我可以用上面的对象做同样的事情,但它只是来自非ARC日期的反射,你总是希望编译器生成保留/释放对象的setter。