在init中使用属性来访问iVars?

问题描述:

这是从前一个问题的分支,这是不好的做法(使用该属性来设置iVars)?在init中使用属性来访问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的是不好的做法。

编辑:新增retain到002版本

加里。

是的,Apple discourages在init或dealloc中使用访问器,因为它们可能具有除了设置实例变量之外的副作用。这些在未初始化或破坏的对象中显然是不受欢迎的。

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

+2

你有一个很高的代表和许多徽章,所以我相信你 – Justin 2010-11-03 20:04:44

+0

谢谢查克,所以你会选择版本002? – fuzzygoat 2010-11-03 20:10:27

+0

@fuzzygoat:理想情况下,这些应该是'copy'属性,并且init方法应该复制而不是保留(因为它们是字符串),否则,是的,我会使用版本2. – Chuck 2010-11-03 20:17:32