从View调用类方法给出:“无法识别的选择器发送到类”

时间:2012-10-24 02:35:49

标签: objective-c ios cocoa-touch

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

当我运行下面的代码时,我在“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];
}

1 个答案:

答案 0 :(得分: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]];

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


如果它已实现,那么您可能必须在Xcode中将实现文件(也称为.m)添加到目标。

顺便说一下:可能你希望你的方法返回一个double而不是double*,一个指向双精度的指针。


你的标题有一个签名:

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

虽然您的实施已经

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

它们不完全相同:

  1. 标头会指向要返回的double的指针。你不希望这样。

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