2

有人可以分享一些关于在初始化方法或指定初始化程序中使用@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

关于为什么应该使用其中一个或另一个的任何建议?

谢谢...

4

5 回答 5

2

Apple 关于这个主题的指南包含在恰当命名的部分Don't Use Accessor Methods in Initializer Methods 和 dealloc中。

于 2012-10-05T20:09:43.193 回答
2

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

换句话说,如果您不打算使用 KVO,您可以使用第二种方法:

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

但是要小心使用 alloc-init,不要忘记自动释放。

于 2012-10-05T19:55:29.243 回答
0

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

之后,@synthesize您可以覆盖您的 getter 以延迟实例化您的属性

例如:

-(NSString *)tempString {

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

-(NSMutableArray *)arrItems {

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

如果您确实想在init方法中设置属性,请使用点表示法,self.myProperty以便它使用为属性定义的设置器,而不是直接使用私有类方法。

于 2012-10-05T20:02:34.267 回答
0

根据 Apple 的说法,您不应init...dealloc方法中使用访问器:

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

取自此文档:封装数据

于 2012-10-05T20:04:05.667 回答
0

由于 Jeremy 提到的原因,在定义它时,通常最好使用属性表示法,部分(大部分?)。

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

另一个原因是保持一致的内存管理模型,尽管它不太重要,因为您使用的是 ARC。但是,如果您不是,并且强保留,那么您将确保您设置到该属性的对象在您设置该属性的任何地方都会自动释放,并且如果您直接设置该属性,则不必处理释放当前值多变的。

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

于 2012-10-05T19:55:47.550 回答