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