工作,但我不知道为什么,客观c

时间:2012-07-22 22:41:37

标签: objective-c xcode properties methods segue

我正在制作一个计算器并且有两个MVC用于数学部分,名为CalculatorFirstViewController,其中有一个名为CalculatorBrain的类。另一个名为GraphViewController的图形部分。

在CalculatorController中,我使用mutableArray作为计算器堆栈,并通过segue将其传递给图形视图控制器。 GraphView的属性称为graphingPoints。之后通过drawrect并调用“programToGraph”方法,该方法将创建一个点到图的数组。令我困惑的是我在“programGraph”中调用了一个方法“runProgram:usingVariableValues”,尽管“runProgram”仅在CalculatorBrain中声明,它是一个单独的目标文件。为什么这个方法调用工作?

@interface CalculatorFirstViewController ()
@property (nonatomic, strong) CalculatorBrain *brain;
@end

@implementation CalculatorFirstViewController
@synthesize brain = _brain;

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

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

   if([segue.identifier isEqualToString:@"Graph"])
   //The call [self.brain program] returns the CalculatorStack
    [segue.destinationViewController setGraphingPoint:[self.brain program]];
  }

这是RunProgram的声明,它在Calculator MVC中使用的CalculatorBrain对象中声明。这是一种类方法。它只是返回在堆栈上执行操作的值。

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

这是graphViewController代码。

-(void) setGraphingPoint:(NSMutableArray*) graphingPoint{

if(_graphingPoint == nil) _graphingPoint = [[NSMutableArray alloc] init ];
    _graphingPoint = graphingPoint;
    //this will call drawrect
    [self.graphingView setNeedsDisplay];
}


-(id) programToGraph:(GraphingView *)sender{

    CGPoint graphPoint;
    NSMutableArray *pointValues = [[NSMutableArray alloc] init];

    for( int x =0;x<5; x++)
    {
        NSDictionary* xValue = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:x] forKey:@"X"];
        graphPoint.x =x;

     //This is the main part I dont get, If calculatorBrain is a seperate object file 
     //and I didn't import it, how am I able to call the method by just saying 
     //CalculatorBrain as the receiver? 

        graphPoint.y = [CalculatorBrain runProgram: self.graphingPoint usingVariableValues:xValue];

        [pointValues addObject:[NSValue valueWithCGPoint:graphPoint]];

}

return pointValues;

}

那么为什么我可以调用runProgram虽然我没有导入CalculatorBrain文件但我没有通过segue传递给其他控制器?

1 个答案:

答案 0 :(得分:0)

Objective-c允许在对象上调用选择器(方法)而无需声明。这是因为实际调用是在运行时查找的。这允许您的代码具有在其他库中实现的类的扩展方法,因为在需要时在运行时发现调用,而不是在编译时。

因此,在运行时查找您的调用并且正常,因为该方法存在。在这种情况下,编译器应该发出警告,说明在编译时找不到该方法,但仍然可以成功编译。

编辑:你仍然需要使用@class转发声明类本身。