2010-11-03 67 views
3

這是從前一個問題的分支,這是不好的做法(使用該屬性來設置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版本

加里。

回答

3

是的,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