49 votes

Erreur étrange NSAssert

Je ne peux pas comprendre pourquoi je reçois

 use of undeclared identifier _cmd  did you mean rcmd
 

sur la ligne où se trouve NSAssert.

 #import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int x = 10;

    NSAssert(x > 11, @"x should be greater than %d", x);

    [pool drain];
    return 0;
}
 

112voto

hooleyhoop Points 6925

À l'intérieur de chaque Objective-c méthode il y a deux variables cachées id self et SEL _cmd

donc

- (void)foo:(id)bar;

est vraiment

void foo(id self, SEL _cmd, id bar) { ... }

et lorsque vous appelez

[someObject foo:@"hello world"]

il est en fait

foo( someObject, @selector(foo), @"hello world")

Si vous cmd-clic sur NSAssert pour sauter à la définition, vous verrez que c'est une macro qui utilise la caché _cmd variable de la méthode que vous appelez de. Cela signifie que si vous n'êtes pas à l'intérieur d'un Objectif-c méthode (vous êtes peut-être en "main"), donc vous n'avez pas de _cmd argument, vous ne pouvez pas utiliser NSAssert.

Au lieu de cela, vous pouvez utiliser les alternatives NSCAssert.

31voto

highlycaffeinated Points 11645

NSAssert est uniquement destiné à être utilisé dans les méthodes Objective-C . Puisque main est une fonction C, utilisez plutôt NSCAssert .

1voto

arun.s Points 961

Essayez de remplacer

NSAssert (x> 11, [NSString stringWithFormat: @ "x doit être supérieur à% d", x]);

avec

NSCAssert (x> 11, [NSString stringWithFormat: @ "x doit être supérieur à% d", x]);

0voto

Alexander Points 6496

Vous devez encapsuler votre chaîne dans une classe NSString si vous souhaitez utiliser des paramètres de format. En effet, @"" est un constructeur par défaut pour une NSString simple. La façon dont elle est écrite donne maintenant un troisième paramètre à la fonction NSAssert et la dérange.

 NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X