我试图了解哪个应该被指定为初始化器,哪个是便利初始化器。我阅读了有关该主题的苹果文档,但我仍然不确定。指定的初始化器是否必须具有类所需的所有值?例如
,这是我创建的第一个指定初始化程序
-(id)initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck
{
self = [super init];
if (self) {
for(int i = 0; i<=cardCount;i++){
Card *card = [deck drawRandomCard];
if (!card) {
self = nil;
break;
}else{
self.cards[i] = card;
}
}
}
return self;
}
现在cardMatchMode
向这个类添加属性,并希望在初始化程序中设置它。为了使类向后兼容并理解初始化器,我保留了我现在拥有的初始化器并创建了另一个初始化器。
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
{
_cardMatchMode = matchMode;
return [self initWithCardCount:cardCount usingDeck:deck];;
}
根据苹果文档,便利初始化程序必须返回指定初始化程序的值,但问题是我可以在便利初始化程序中设置此类的额外属性吗?我可以说self.cardMatchMode = matchMode;
还是 self 还没有完全初始化?
它确实有效,但我只是想了解这是否是正确的代码,并且我可以在方便的 init 中访问 cardMatchMode 属性,否则我将不得不
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
作为指定的初始化器和另一个方便的初始化和返工代码?谢谢!
/////更新
我在
-(id)initwithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
当我尝试执行self = [self initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck*)deck;
错误时,您无法在 init 系列之外分配 self 。我弄清楚了问题所在。init 方法有小写的 w 并且它必须是大写的,所以现在它可以工作了。这是我现在为我的便利初始化程序提供的代码。
-(id)initWithCardCount:(NSUInteger)cardCount usingDeck:(Deck *)deck cardMatchMode:(NSUInteger)matchMode
{
self = [self initWithCardCount:cardCount usingDeck:deck];
if (self){
_cardMatchMode = matchMode;
}
return self;
}
现在这更有意义了。我调用了调用 super 的指定 init,然后我设置了cardMatchMode
变量。
据我了解,有很多对象都有带有额外参数的便利初始化程序,它只会调用指定的初始化程序。如果你看一下 NSString ,它有不同的初始化器和不同的参数。它可能正在调用指定的初始化程序 init。这个对吗?