У меня следующая ситуация, я не могу разрешить:
@interface Deck : NSObject
@interface MasterDeck : Deck
@interface PlayerDeck : Deck
Внутри MasterDeck
класса, в рамках инициализации, я вызываю
[self cutDeckImageIntoCards]; // We don't get to execute this method
Вызов результатов вошибка [PlayerDeck cutDeckImageIntoCards]: unrecognized selector sent to instance
Действительно, PlayerDeck
не имеет этого метода ... но почему он вообще вызывается?
После просмотра инициализации MasterDeck я добавилнесколько операторов отладки:
static MasterDeck *gInstance = NULL;
+(MasterDeck *) instance {
@synchronized(self) {
if (gInstance == NULL) {
gInstance = [[self alloc] init];
}
}
return gInstance;
}
-(id) init {
if (gInstance != NULL) {
return gInstance;
}
// MasterDeck
self = [super init];
// PlayerDeck
if (self) {
// Lots of stuff
[self cutDeckImageIntoCards]
// Some more stuff
}
gInstance = self;
return gInstance;
}
Хорошо, поэтому MasterDeck является PlayerDeck, потому что 'Deck считает, что это PlayerDeck ... Колода подтверждает
Колода создается следующим образом:
static Deck *gInstance = NULL;
+(Deck *) instance {
@synchronized(self) {
if (gInstance == NULL) {
gInstance = [[self alloc] init];
}
}
return gInstance;
}
-(id) init {
if (gInstance != NULL) {
return gInstance;
}
self = [super init];
if (self) {
// Do something
}
NSLog(@"Deck thinks it's a %@", [[self class ]description]); // PlayerDeck
gInstance = self;
return gInstance;
}
Итак, еще раз
@interface Deck : NSObject
Если предположить, что выше реализации Singleton, почему бы Deck думал, что это на самом деле PlayerDeck