使用@property ivars的最佳做法

问题描述:

有人可以分享一些有关在init方法或指定初始值设定项中使用@property iVars的最佳实践/代码约定的一些知识吗?使用@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 

为什么一个或另一个应该用什么建议?

谢谢...

+0

在您的示例中,我通常会使用属性设置器来指定值,例如, 'self.tempString = @“一些价值”;'。原因是因为你可能在setter中有一些自定义逻辑。例如,也许你的tempString setter想要从电话号码中删除破折号。如果您直接将值分配给伊娃,您将绕过该逻辑。这个想法是,如果你有一个,那么使用setter,除非你看到一个理由不。请注意,如果您直接分配给ivars,则需要自己管理保留/复制/原子结构(setter处理此操作,除非被覆盖)。 – Jeremy

有关此主题的Apple指南已包含在适当命名的部分Don’t Use Accessor Methods in Initializer Methods and dealloc中。

阅读此线程:Why shouldn't I use Objective C 2.0 accessors in init/dealloc?

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

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

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

+0

从代码示例中'strong'的存在判断,他必须使用ARC,所以'autorelease'不适用。 – Rob

+0

感谢您的回复,如果我直接分配给_tempString,我不需要在ARC下保留/复制,我是否明白这一点? –

+0

是的,Rob是对的。使用ARC你不需要autorelease。 –

由于Jeremy提到的原因,在定义它时部分(主要是?)使用属性符号通常会更好。

当您可以在方法setter覆盖中设置断点并将其应用于修改变量的所有代码路径时,调试特定变量将变得非常容易。

另一个原因是保持一致的内存管理模型,尽管它使用ARC以后不太重要。如果你不是那么强壮,那么你会确保你设置的属性在你设置属性的任何地方都是自动释放的,如果你直接设置属性,不必处理释放当前值变量。

无论您使用何种实践,一致性对维护/可读性和调试都很重要。

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

后,您@synthesize您可以覆盖你的getter懒洋洋地实例化你的财产

例如:

-(NSString *)tempString { 

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

-(NSMutableArray *)arrItems { 

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

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

据苹果,你应该使用存取在init...dealloc方法:

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

取自该文档:Encapsulating Data