对象找不到方法

时间:2014-05-08 15:12:47

标签: objective-c

我目前正在阅读这本书" 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;
}

为什么我可以创建对象,但对象无法找到在其头文件中声明的方法?

提前致谢!

1 个答案:

答案 0 :(得分:0)

项目文件夹中有两个具有相同名称的头文件,编译器使用的是较旧的头文件,其中未声明该方法。

Xcode只查看作为引用添加到项目中的文件。但是,编译器不会看到哪些头文件被添加到项目中,因为它不适用于单个标题 - 它与标题搜索路径(文件夹)一起使用。这意味着当它正在编译并且它正在寻找.h文件时,它会递归搜索文件夹,直到找到它为止。如果有两个具有相同名称的文件,它将使用它找到的第一个文件。