2009-12-08 8 views
0

Voici un caractère étrange. J'ai une classe nommée TileMap avec l'interface suivante:'TileMap' peut ne pas répondre à '+ mapNamed:'

@interface TileMap : NSObject 
{ 
    int *data; 
    int tilesWide; 
    int tilesHigh; 
    NSString *imageName; 
} 

+ (id)mapNamed:(NSString *)filename; 
- (id)initWithFile:(NSString *)filename; 

@end 

La mise en œuvre ressemble à ceci:

@implementation TileMap 

+ (id)mapNamed:(NSString *)filename 
{ 
    return [[self alloc] initWithFile:filename]; 
} 

- (id)initWithFile:(NSString *)filename 
{ 
    if (self = [super init]) 
    { 
     // ... 
    } 
    return self; 
} 


@end 

Mais quand j'ajoute un appel à [TileMap mapNamed:@"map.plist"]; à ma demande Xcode met en garde:

'TileMap' ne peut pas répondre à '+ mapNamed:'

L'application compile bien et les appels à NSLog au sein de TileMap-initWithFile: sont enregistrés. J'ai remarqué que la coloration syntaxique de Xcode était désactivée pour cette classe et cette méthode, j'ai donc essayé de renommer la classe et la méthode séparément. La seule combinaison qui a éliminé les problèmes d'avertissement et de coloration syntaxique était de renommer la classe et la méthode. Est-ce que je suis en collision avec une classe ou une méthode de cadre non documentée? Trouver dans la documentation ne révèle rien. Find in Project ne révèle que l'appel, la définition de l'interface et l'implémentation. Je suis perplexe (pas qu'il en faut beaucoup). Y a-t-il un moyen de contourner cela sans mélanger mes conventions de nommage existantes?

Répondre

2

Il s'avère que mon répertoire de projet s'est terminé avec deux fichiers TileMap.h et TileMap.m - visibles depuis le Finder mais pas dans Xcode. Un, une interface complète et l'implémentation, dans mon répertoire de projet racine. L'autre juste une sous-classe NSObject nue dans mon sous-répertoire framework. Je ne sais pas comment cela est arrivé. La suppression de ce dernier a résolu le problème. Merci pour l'aide tout de même Dave.

5

Avez-vous #import l'en-tête TileMap.h? Avez-vous enregistré votre en-tête TileMap.h?

+0

* tête dans la honte se bloque * J'ai un framework.h qui importe tous mes en-têtes cadres comme ceci:. \t // ... \t #import "State.h" \t #import « tilemap .h " \t // ... Puis j'importe framework.h dans des fichiers non-framework, dans ce cas TitleState.h (qui étend' State'). Aucune des autres classes et méthodes importées de cette manière ne provoque une coloration d'avertissement ou de syntaxe, mais vous avez raison. Supprimer le '#import" TileMap.h "' de framework.h et l'ajouter directement à TitleState.m élimine l'avertissement (les problèmes de coloration syntaxique persistent mais je peux vivre avec ça). –

+0

Je pensais que cela répondait à ma question mais en y réfléchissant un peu plus, pourquoi n'est-ce pas un problème si je renommais la classe et la méthode? –

1

Shaun,

outre le problème que vous avez demandé à propos, vous avez également une fuite de mémoire dans +mapNamed:. La ligne suivante retourne un objet non-autoreleased avec un retain nombre de +1, ce qui donne essentiellement la propriété de l'appelant:

return [[self alloc] initWithFile:filename]; 

Selon le Memory Management Programming Guide for Cocoa, vous devez retourner des objets autoreleased de méthodes pratiques, comme ceci:

return [[[self alloc] initWithFile:filename] autorelease]; 

Si vous avez Snow Leopard et Xcode 3.2, vous pouvez essayer d'exécuter l'analyseur statique pour trouver des erreurs comme celle-ci en appuyant sur Cmd + Maj + A.

+0

Merci Alexander, c'est bon à savoir. –

+0

Pour ceux qui lisent ceci en 2011 ou plus tard, cela a été écrit quand nous n'avions pas ARC. Cela ne s'applique évidemment plus lorsque vous utilisez ARC, bien qu'il s'applique toujours à la gestion manuelle de la mémoire. –

Questions connexes