我试图了解哪个应该指定初始化程序以及哪个便利初始化程序。我阅读了有关该主题的苹果文档,但我仍然不确定。指定的初始值设定项是否必须具有类所需的所有值?例如
这是我创建的第一个指定初始化器
-(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 还没有完全初始化?
它确实有效,但我只是想了解这是否是正确的代码,我可以在方便的初始化中访问 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 ,它是指定的初始化程序。这是正确的吗?
最佳答案
指定构造器是调用其类的父类(super class)的指定构造器的构造器,因此它是唯一调用对象 super
上的方法的构造器。类中没有其他初始化程序应该这样做;这些次要初始化程序应该使用 self
调用指定的初始化程序。通常,指定的初始值设定项具有创建有用的类对象所需的所有参数。
简而言之,指定构造器是唯一调用super
上构造器的构造器,类中的所有其他构造器都调用指定构造器(使用self
)。
关于ios - objective-c 中的指定初始化器和便利初始化器以及如何正确创建它们并将它们绑定(bind)在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18112569/