使用属性在init中访问iVars?

时间:2010-11-03 19:53:23

标签: iphone objective-c cocoa-touch

这是上一个问题的分支,这是不好的做法(使用属性来设置iVars)?

// Designated initializer 001
- (id)initWithName:(NSString *)newName andType:(NSString *)newType {
    self = [super init];
    if(self) {
        [self setName:newName];
        [self setType:newType];
    }
    return self;
}

或者我应该使用......

// Designated initializer 002
- (id)initWithName:(NSString *)newName andType:(NSString *)newType {
    self = [super init];
    if(self) {
        name = [newName retain];
        type = [newType retain];
    }
    return self;
}

我一直在使用版本001,但我们一直认为使用属性来访问init或dealloc中的iVars是不好的做法。

编辑:retain添加到版本002

加里。

1 个答案:

答案 0 :(得分:3)

是的,Apple discourages在init或dealloc中使用访问器,因为它们除了设置实例变量之外还有副作用。这些在未初始化或被破坏的物体中显然是不可取的。

来自文档的确切引用:“你不应该使用访问器方法来设置实例变量的唯一地方是init方法和dealloc。”