使用@property ivars的最佳实践

有人可以分享一些关于在init方法或指定的初始化方法中使用@property iVars的最佳实践/代码约定的一些知识吗?

请看我的例子:

@interface MyClass () @property(nonatomic,strong) nsstring *tempString; @property(nonatomic,strong) NSMutableArray *arrItems; @end @implementation ViewController - (id)init { if (self = [super init]) { //Is this best practice / correct _tempString = @""; _arrItems = [[NSMutableArray alloc] initWithCapacity:0]; ... ... //Or this self.tempString = @""; self.arrItems = [[NSMutableArray alloc] initWithCapacity:0]; } return self; } @end 

任何build议,为什么一个或另一个应该使用?

谢谢…

有关此主题的Apple指南包含在适当命名的部分“不使用初始化方法中的访问器方法”和dealloc中 。

阅读本主题: 为什么我不应该在init / dealloc中使用Objective C 2.0访问器?

换句话说,如果你不想使用KVO,你可以使用第二种方法:

 //Or this self.tempString = @""; self.arrItems = [[NSMutableArray alloc] initWithCapacity:0]; 

但是要小心alloc-init,不要忘记autorelease。

当你定义它时通常使用财产符号,部分(大多数?)是因为杰里米提到的原因。

debugging一个特定的variables是一件容易的事情,当你可以在方法setter覆盖中设置一个断点,并使其适用于修改variables的所有代码path。

另一个原因是要保持一致的内存pipe理模式,尽pipe从使用ARC开始它不那么重要。 如果你不是那么坚强,那么你就要确保你设置的属性在你设置属性的任何地方都是自动释放的,如果你直接设置属性,不必处理释放当前值variables。

无论您使用什么实践,一致性对于维护/可读性和debugging都很重要。

我更喜欢懒惰的实例化方法的属性。

@synthesize后,你可以重写你的getter懒惰实例化你的财产

例如:

 -(NSString *)tempString { if(!tempString) { _tempString = @""; } return _tempString; } 

 -(NSMutableArray *)arrItems { if(!_arrItems) { _arrItems = [[NSMutableArray alloc] initWithCapacity:0]; } return _arrItems; } 

如果你想在init方法中设置你的属性,使用点符号self.myProperty以便它直接使用定义的属性而不是私有类方法。

根据苹果,你不应该在init...dealloc方法中使用访问器:

您应该始终直接从初始化方法中访问实例variables,因为在设置属性时,对象的其余部分可能尚未完全初始化。 即使你没有提供自定义的访问器方法,也不知道你自己类中的任何副作用,未来的子类很可能会覆盖这个行为。

从这个文档采取: 封装数据 。