#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 的位置?为什么它编译,它没关系?它应该崩溃,但我找不到解释....
谢谢!
答案 0 :(得分:2)
如果你将它们暴露给世界,你只需要在.h文件的@interface
中声明方法。否则,不需要声明。
现在,它们在实施中出现的顺序也无关紧要。从历史上看,如果方法稍后在@implementation
中实现,而不是在调用方法中实现,则需要使用上面声明的方法(通常在@interface
中)。现在,编译器并不关心.m文件中的实现是早期还是稍后。
答案 1 :(得分:2)
编译器可以看到它的定义:
+ (double)popOperandOffProgramStack:(NSMutableArray *)stack
{
double result = 0;
return result;
}
所以它能够确认它已被声明,参数类型和返回类型。
另外 - 在较旧的编译器中,它需要先于使用,但如果在@implementation
范围内使用则不再需要。
即使没有声明,objc也足够弱,不会出现编译错误(也许是警告)。例外:如果您使用ARC,则该方法必须可见。当启用ARC时,编译器需要知道引用计数语义和参数类型。