没有接口的实例类或方法?

时间:2012-08-14 22:59:02

标签: iphone objective-c ios ipad

得到了这段代码:

#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 的位置?为什么它编译,它没关系?它应该崩溃,但我找不到解释....

谢谢!

2 个答案:

答案 0 :(得分:2)

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

现在,它们在实施中出现的顺序也无关紧要。从历史上看,如果方法稍后在@implementation中实现,而不是在调用方法中实现,则需要使用上面声明的方法(通常在@interface中)。现在,编译器并不关心.m文件中的实现是早期还是稍后。

答案 1 :(得分:2)

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

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

所以它能够确认它已被声明,参数类型和返回类型。

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

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