1

得到这个代码:

#import <Foundation/Foundation.h>
@interface CalculatorBrain : NSObject
- (void)pushOperand:(double)operand;
- (double)performOperation:(NSString *)op;
@property (nonatomic, readonly) id program;
+ (NSString *)descriptionOfProgram:(id)program;
+ (double)runProgram:(id)program;
@end

和这个:

#import "CalculatorBrain.h"
@interface CalculatorBrain()
@property (nonatomic, strong) NSMutableArray *programStack;
@end
@implementation CalculatorBrain
@synthesize programStack = _programStack;
- (NSMutableArray *)programStack
{
if (_programStack == nil) _programStack = [[NSMutableArray alloc] init];
return _programStack;
}
- (id)program
{
return [self.programStack copy];
}
+ (NSString *)descriptionOfProgram:(id)program
{
return @"blablabla";
}
    - (void)pushOperand:(double)operand
{
   [self.programStack addObject:[NSNumber numberWithDouble:operand]];
}

- (double)performOperation:(NSString *)operation
{
[self.programStack addObject:operation];
return [[self class] runProgram:self.program];
}

+ (double)popOperandOffProgramStack:(NSMutableArray *)stack
{
   double result = 0;
   return result;
}
+ (double)runProgram:(id)program
{
   NSMutableArray *stack;
   if ([program isKindOfClass:[NSArray class]]) {
      stack = [program mutableCopy];
   }
   return [self popOperandOffProgramStack:stack];
}
@end

代码运行良好,所以问题是,popOperandOffProgramStack在界面中声明的位置在哪里?为什么它编译并且没关系?它应该崩溃,但我找不到对此的解释....

谢谢!

4

2 回答 2

2

@interface如果您将它们暴露给世界,您只需要在 .h 文件中声明方法。否则,不需要声明。

现在,它们在实现中出现的顺序也无关紧要。从历史上看,如果该方法的实现晚于@implementation调用它的位置,则您需要在上面声明该方法(通常在@interface. 现在编译器不关心 .m 文件中的实现是更早还是更晚。

于 2012-08-14T23:01:02.503 回答
2

编译器可以看到它的定义:

+ (double)popOperandOffProgramStack:(NSMutableArray *)stack
{
   double result = 0;
   return result;
}

因此它能够确认它已被声明、参数类型和返回类型。

另外 - 在较旧的编译器中,它需要先于使用,但如果在@implementation范围内使用,则不再需要。

即使没有声明,objc 也足够弱,不会是编译器错误(可能是警告)。例外:如果您使用 ARC,则该方法必须可见。启用 ARC 时,编译器需要知道引用计数语义和参数类型。

于 2012-08-14T23:01:11.513 回答