Acceso al método de class en el objective c. Usando self o classname?

Estoy aprendiendo progtwigción iOS y estoy confundido por el siguiente código sobre el uso de la palabra key self.

Desde mi comprensión, el self es como Java es this . Se refiere a la instancia actual. Cuando quiero llamar a un método de class, la forma habitual debería ser como [PlayingCard validSuits]; Pero también está bien invadir un método de class en una instancia, ¿verdad? Al igual que [self validSuits]; (Estoy en la class por lo que se refiere a una instancia de PlayingCard)

Pero en el siguiente código, da error en algún lado pero se ve bien en otra parte. (Indicado por 3 comentarios, esto está dentro de Xcode 5.1)

¿Me estoy perdiendo algo?

(PS, creo que estoy teniendo el problema similar que aquí , que nadie respondió aún. Obtuvo el mismo error incluso usando [PlayingCard validSuits]).

 // PlayingCard.m #import "PlayingCard.h" @implementation PlayingCard @synthesize suit = _suit; + (NSArray *)validSuits { return @[@"♠︎", @"♣︎", @"♥︎", @"♦︎"]; } + (NSArray *)rankStrings { return @[@"?", @"A", @"2", @"3", @"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"]; } + (NSUInteger)maxRank { return [[PlayingCard rankStrings] count] -1; //1. [self rankStrings] works fine.** } //override super class's method - (NSString *)contents { NSArray *rankStrings = [PlayingCard rankStrings]; //2. if change rankStrings to self, then error: //No visible @interface for 'PlayingCard' declares the selector 'rankStrings' return [rankStrings[self.rank] stringByAppendingString:self.suit]; } - (void) setSuit:(NSString *)suit { if ( [[PlayingCard validSuits] containsObject:suit]) { //3.error when changed to [self validsuits] //No visible @interface for 'PlayingCard' declares the selector 'validsuits'** _suit = suit; } } - (NSString *) suit { return _suit ? _suit : @"?"; } @end 

El file de encabezado:

 // PlayingCard.h #import "Card.h" @interface PlayingCard : Card @property (nonatomic, strong) NSString *suit; @property (nonatomic) NSUInteger rank; + (NSArray *) validSuits; + (NSUInteger) maxRank; @end 

Si llama a otro método de class desde el interior de un método de class (de la misma class), puede usar [self classMethod] . Sin embargo, si está en un método de instancia y necesita llamar a ese método de classs, puede usar [[self class] classMethod]

Como señaló @Martin R : si subclassa PlayingCard , llamar a self en un método de class será esa subclass y no PlayingCard .

EDITAR:

Para completar lo que necesita hacer:

 // PlayingCard.m #import "PlayingCard.h" @implementation PlayingCard @synthesize suit = _suit; + (NSArray *)validSuits { return @[@"♠︎", @"♣︎", @"♥︎", @"♦︎"]; } + (NSArray *)rankStrings { return @[@"?", @"A", @"2", @"3", @"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"]; } + (NSUInteger)maxRank { return [[self rankStrings] count] -1; } //override super class's method - (NSString *)contents { NSArray *rankStrings = [[self class] rankStrings]; return [rankStrings[self.rank] stringByAppendingString:self.suit]; } - (void) setSuit:(NSString *)suit { if ( [[[self class] validSuits] containsObject:suit]) { _suit = suit; } } - (NSString *) suit { return _suit ? _suit : @"?"; } @end