2009-02-27 6 views
0

J'ai une classe qui contient une collection d'objets. J'essaye de créer une méthode qui retournera le premier membre de la collection correspondant à un prédicat fourni.Sélecteur non reconnu mais débogage peut le voir

Voici la méthode de collecte:

... 
//predicate is a boolean method that accepts an object as its single parameter 
-(id<Notation>) getFirstChildMatching: (SEL) predicate declaredInInstance:(id) instance 
{ 
    NSMethodSignature *sig = [[instance class] instanceMethodSignatureForSelector:predicate]; 
    NSInvocation *myInvocation = [NSInvocation invocationWithMethodSignature:sig]; 
    [myInvocation setTarget:instance]; 
    [myInvocation setSelector:predicate]; 

    int numItems = childNotations.count; 
    for(int i=0;i< numItems;i++) 
    { 
     id<Notation> thisNotation = [childNotations objectAtIndex:i]; 
     [myInvocation setArgument:thisNotation atIndex:2]; 
     BOOL result =NO; 
     [myInvocation retainArguments]; 
     [myInvocation invoke]; 
     [myInvocation getReturnValue:&result]; 

     if (result) 
      return thisNotation; 

    } 

    return nil; 
} 

J'ai créé une classe de test qui teste cette méthode. Voici la méthode d'essai plus le prédicat:

- (void) testGetFirstChildMatching 
{ 
    Leaf *line1 = [[Leaf alloc] initWithValue:1 step:Step_A andNumber:1]; 
    Leaf *line2 = [[Leaf alloc] initWithValue:2 step:Step_B andNumber:2]; 

    SEL mySelector = @selector(valueIs1:); 

    id<CompositeNotation> compositeNotation = [[CompositeNotation alloc] init]; 
    [compositeNotation addNotation:line1]; 
    [compositeNotation addNotation:line2]; 

    id notation = [compositeNotation getFirstChildMatching: mySelector declaredInInstance:self]; 
    STAssertEquals(YES, [notation isKindOfClass:[Leaf class]], @"Should be of type Leaf: %@", notation); 
    //Leaf *found = ((Leaf *)notation); 
    STAssertEquals([notation value], line1.value, @"Should have found line 1 with value 1: actual %i", [notation value]); 
    [line1 release]; 
    [line2 release]; 
} 

-(BOOL) valueIs1: (Leaf *) leaf 
{ 
    if (leaf.value == 1) 
     return YES; 

    return NO; 
} 

Ce que je trouve que le « if (leaf.value == 1) » ligne Je reçois un « sélecteur non reconnu envoyé à la classe ». Ce qui n'a pas de sens, c'est que le débogueur peut voir la propriété value et sa valeur donc l'objet a clairement ce select. Des idées?

BTW feuille implémente le protocole de notation

Répondre

1

J'ai finalement trouvé le problème. Ce fut cette ligne

[myInvocation setArgument:thisNotation atIndex:2]; 

il aurait été

[myInvocation setArgument:&thisNotation atIndex:2]; 

Merci

3

Typo dans la définition de la fonction?

-(BOOL) valueIs1: (Leaf *) Leaf // <== should be "leaf" not "Leaf" ? 

Le fait que vous obtenez un « sélecteur non reconnu envoyé à classe », pas exemple, implique que leaf est un Class. Deux choses à vérifier:

  • Assurez-vous que l'initialiseur initWithValue de Leaf renvoie un objet.
  • Assurez-vous que addNotation: ajoute correctement Leafs au tableau.
+0

bon argument pour le choix d'une stratégie de nommage des variables moins confuse. – danielpunkass

+0

en fait c'était juste une faute de frappe causée par la transposition du code à stackoverflow. Ils ne sont pas les noms d'origine. Je vais corriger le post – Ian1971

Questions connexes