0

我正在尝试调用在导入的头文件中定义的类方法。

当我运行下面的代码时,我在“double *result = ...”行的视图中收到此错误:

+[CalculatorBrain runProgram:usingVariableValues:]: unrecognized selector sent to class 0x6908

** CalculatorViewController.m **

#import "CalculatorViewController.h"
#import "CalculatorBrain.h"

@interface CalculatorViewController()

@property (nonatomic, strong) CalculatorBrain *brain;
@property (nonatomic, strong) NSMutableDictionary *variableValues;

@end

@implementation CalculatorViewController

@synthesize brain = _brain;
@synthesize variableValues = _variableValues;

- (CalculatorBrain *)brain {
    if (!_brain) _brain = [[CalculatorBrain alloc] init];
    return _brain;
}

- (NSMutableDictionary *)variableValues {
    if (!_variableValues) {
        _variableValues = [[NSMutableDictionary alloc] init];
    }
    return _variableValues;
}

- (IBAction)enterPressed {

    double *result = [CalculatorBrain runProgram:[self.brain program] usingVariableValues:[self variableValues]];

}

** CalculatorBrain.h **

#import <UIKit/UIKit.h>

@interface CalculatorBrain : NSObject

+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;

@property (readonly) id program;


@end

** CalculatorBrain.m **

#import "CalculatorBrain.h"

@interface CalculatorBrain()
    @property (nonatomic, strong) NSMutableArray *programStack;
@end

@implementation CalculatorBrain

@synthesize programStack = _programStack;


... other code ...

+ (double)runProgram:(id)program :(NSDictionary *) usingVariableValues 
{

    NSLog(@"variableValues is %@", usingVariableValues);

    NSMutableArray *stack;

    if ([program isKindOfClass:[NSArray class]]) {

        stack = [program mutableCopy];

        NSLog(@"runProgram");

        // if vars are passed in
        if ([usingVariableValues isKindOfClass:[NSDictionary class]]) {

            NSLog(@"vars are passed in: %@", usingVariableValues);

            id obj;
            int index = 0;

            NSEnumerator *enumerator = [program objectEnumerator];

            // for every obj in programStack
            while ((obj = [enumerator nextObject])) {

                id varVal = [usingVariableValues objectForKey:(obj)];

                // test
                NSLog(@"usingVariableValues objectForKey:(obj) is %@", varVal);

                // if the obj is a variable key
                if (!varVal) {
                    varVal = 0;

                    NSLog(@"varVal is false");
                }

                NSLog(@"Replacing object at index %@ of stack with var %@", index, varVal);


                // replace the variable with value from usingVariableValues OR 0
                [stack replaceObjectAtIndex:(index) withObject:varVal];

                index += 1;

            }
        }

    }

    return [self popOperandOffStack:stack];
}
4

1 回答 1

1
+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;

被定义为类方法,但你把它称为对象方法

 double *result = [self.brain runProgram:[self.brain program] usingVariableValues:[self variableValues]];

要在课堂上调用它:

 double *result = [[self.brain class] runProgram:[self.brain program] usingVariableValues:[self variableValues]];

或者

double *result = [CalculatorBrain runProgram:[self.brain program] usingVariableValues:[self variableValues]];

您更改了代码,表明仍未找到该方法。你实施了吗?


如果它被实现,那么您可能必须将实现文件(又名 .m)添加到 Xcode 中的目标。

顺便说一句,:可能您希望您的方法返回 a doublenot a double*,一个指向 double 的指针。


你的标题有一个签名:

+ (double *)runProgram:(id)program usingVariableValues:(NSDictionary *)variableValues;

虽然您的实施有

+ (double)runProgram:(id)program :(NSDictionary *) usingVariableValues 

它们不相同:

  1. 标头承诺要返回一个指向双精度的指针。你不想要那个。

  2. 他们甚至没有同名 +runProgram:usingVariableValues:vs+runProgram::

于 2012-10-24T02:39:13.797 回答