2011-03-13 3 views
2

J'essaie de suivre un article de blog Dave DeLong here. Nous construisons une catégorie sur NSNumber pour calculer la factorielle. Il semble fonctionner très bien, mais quand je l'envelopper dans un NSExpression et essayer d'évaluer l'expression, je reçoisFonctions personnalisées avec NSExpression: sélecteur non reconnu

[NSCFNumber factorial:]: unrecognized selector sent to instance 0x100108d40' 

Mais l'objet à cette adresse est le NSNumber, qui reconnaît que sélecteur. Je suis perplexe.

#import <Foundation/Foundation.h> 

@interface NSNumber (FactorialExpression) 
- (NSNumber *) factorial; 
@end 

@implementation NSNumber (FactorialExpression) 
- (NSNumber *) factorial { 
    double baseValue = [self doubleValue]; 
    double result = tgamma(baseValue+1); 
    return [NSNumber numberWithDouble:result]; 
} 
@end 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    NSNumber *n = [NSNumber numberWithDouble:4.2]; 
    NSLog(@"%@ %@", n, [n factorial]); 
    NSLog(@"%p %d", n, [n respondsToSelector:@selector(factorial)]); 

    NSExpression *f = [NSExpression expressionForConstantValue:n]; 
    NSExpression *e = [NSExpression expressionForFunction:f 
              selectorName:@"factorial:" 
               arguments:nil]; 
    NSLog(@"operand %@ %@", [e operand], [[e operand] class]); 
    NSLog(@"operand %@", [e function]); 

    id result = [e expressionValueWithObject:nil context:nil]; 
    //NSLog(@"%@ %@", [result description], [result class]); 
    [pool drain]; 
    return 0; 
} 

2011-03-13 10:09:02.312 test[94896:903] 4.2 32.57809605033135 
2011-03-13 10:09:02.314 test[94896:903] 0x100108d40 1 
2011-03-13 10:09:02.315 test[94896:903] operand 4.2 NSConstantValueExpression 
2011-03-13 10:09:02.316 test[94896:903] operand factorial: 
2011-03-13 10:09:02.316 test[94896:903] -[NSCFNumber factorial:]: unrecognized selector sent to instance 0x100108d40 

Qu'est-ce que je ne comprends pas à ce sujet? Merci.

C'est embarrassant. Une faute de frappe stupide. Désolé les gars.

Répondre

0
NSExpression *e = [NSExpression expressionForFunction:f selectorName:@"factorial:" arguments:nil]; 

Le nom du sélecteur ne doit pas avoir deux points à la fin.

0

J'ai eu un problème avec les catégories, mais je testais une bibliothèque statique. J'ai donc dû ajouter un drapeau -ObjC linker au projet.

Questions connexes