我目前正在阅读这本书" Objective C programming"来自Big Nerd Ranch的第2版,我有一天因练习而陷入困境。
我有一个对象应该向方法发送消息,但是我得到一个错误,即没有声明方法的@interface。
BNRPortfolio.h:
#import <Foundation/Foundation.h>
@class BNRStockHolding;
@interface BNRPortfolio : NSObject
{
NSMutableArray *_portfolios;
}
@property (nonatomic) double currentValue;
- (void)addStock:(BNRStockHolding *)s;
@end
BNRPortfolio.m:
#import "BNRPortfolio.h"
#import "BNRStockHolding.h"
@implementation BNRPortfolio
- (double)currentValue:(BNRStockHolding *)holding
{
return [holding valueInDollars] - [holding costInDollars];
}
- (void)addStock:(BNRStockHolding *)s
{
// Do we have an array?
if (!_portfolios) {
// If not, create one
_portfolios = [[NSMutableArray alloc]init];
}
[_portfolios addObject:s];
}
@end
的main.m:
#import <Foundation/Foundation.h>
#import "BNRStockHolding.h"
#import "BNRForeignStockHolding.h"
#import "BNRPortfolio.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
BNRStockHolding *holding1 = [[BNRStockHolding alloc] init];
[holding1 setPurchaseSharePrice:2.30];
[holding1 setCurrentSharePrice:4.50];
[holding1 setNumberOfShares:40];
[holding1 setNameOfHolding:@"holding1"];
// Everything is good until here and already tested
BNRPortfolio *portfolio = [[BNRPortfolio alloc] init];
[portfolio addStock:holding1]; // Throws error of undefined declaration of addStock in
//BNRPortfolio
}
return 0;
}
为什么我可以创建对象,但对象无法找到在其头文件中声明的方法?
提前致谢!
答案 0 :(得分:0)
项目文件夹中有两个具有相同名称的头文件,编译器使用的是较旧的头文件,其中未声明该方法。
Xcode只查看作为引用添加到项目中的文件。但是,编译器不会看到哪些头文件被添加到项目中,因为它不适用于单个标题 - 它与标题搜索路径(文件夹)一起使用。这意味着当它正在编译并且它正在寻找.h
文件时,它会递归搜索文件夹,直到找到它为止。如果有两个具有相同名称的文件,它将使用它找到的第一个文件。