2011-06-18 4 views
0

J'ai une classe Class, qui a une catégorie privée (@interface Class (Private)). La catégorie a une méthode nommée "-run". Mais, quand XCode montre que [classInstance run]; "peut ne pas répondre à -run". Je ne suis pas sûr de savoir pourquoi. La méthode s'exécute correctement et est déclarée dans le même fichier .m que la classe réelle. Juste au-dessus de la mise en œuvre de la classe réelle.Implémentation de catégorie montrant l'issue possible

Des idées que je fais mal?

Voici mon fichier .m entier. Je sais que c'est étendre NSArray en ce moment, mais je l'ai fait de cette façon pour montrer l'exemple sans aucune autre dépendance.

#import <Foundation/Foundation.h> 
@implementation NSArray (Private) 

-(void)runMethod {} 

@end 

@implementation NSArray 

- (void)letsPlay { 
    [self runMethod]; // says -runMethod might be missing 
} 

@end 
+0

Pouvez-vous publier le fichier d'implémentation? (au moins les parties clés de celui-ci) – drewag

Répondre

2

Tant que le compilateur voit la déclaration de la méthode run avant l'appel de la méthode, vous ne verrez pas cette erreur.

Habituellement, les catégories privées sont faites comme:

#import "M.h" 
@interface M(PrivateGunk) 
.... declarations here ... 
@end 

@implementation M 
@end 

@implementation M(PrivateGunk) 
.... impl here ... 
@end 

Bien que beaucoup d'entre nous ont déménagé à coller l'étoffe privée dans une extension de classe en haut du fichier, ce qui permet également de @properties, Ivars, etc ....

+0

J'ai fait exactement cela, et il me dit toujours que les méthodes privées sont manquantes. – David

+0

Je pense que j'ai peut-être trouvé où je me suis trompé. L'interface @ est-elle requise, même si la @ implémentation privée est supérieure à la mise en œuvre réelle? Voir ma modification dans le message original. – David

+0

Huh - Je suis surpris qu'il compilé du tout. La mémoire musculaire m'a toujours couplé une catégorie '@ implementation' avec une catégorie' @ interface'. Dans tous les cas, il semble que le compilateur ne considère pas les méthodes dans un @ implémentation comme une déclaration dans le contexte d'un autre "@ implementation". Punaise? Fonctionnalité? Je vais devoir réfléchir à cela, mais s'il vous plaît envoyez un bug, si vous avez un moment. – bbum

Questions connexes