使用cocos2d,似乎在某些消息传递实例中会出现这种情况。我不得不承认,我对Objective-C并不精通,因为我在编写一些代码时正在阅读本书。

对于熟悉cocos2d的人,您有一个CCLayer类。就我而言,我有一个GameLayer,其中有一些子图层,如下所示:

@interface GameLayer : CCLayer {
  CCSprite *_background;
  CCPanZoomController *_controller;
  CCLayer *_truckLayer;
}


然后,我有一个特殊的initWithLayers方法在此层中添加我的子层:

-(id)initWithLayers:(TruckLayer *)truck
{
if( (self=[super init])) {
    self.truckLayer = truck;
    .....
}


现在,如果我曾经向self.truckLayer发送消息,则会在Xcode中收到以下警告:

'CCLayer' may not respond to 'getNextAvailableSpot'


一个例子可能是这样的:

CGPoint nextSpot = [self.truckLayer getNextAvailbleSpot];


所有这些代码都可以编译并成功运行,因此我对这里缺少的内容感到好奇吗?如果我在这里做错了事,我不希望我的代码受这些困扰。

最佳答案

这是因为您将*_truckLayer声明为CCLayer,但是在init上将(TruckLayer *)truck分配给CCLayer* _truckLayer。因此CCLayer不了解getNextAvailableSpot方法,因此编译器会向您发出警告。

该代码运行良好,因为_truckLayer是指向正确的TruckLayer的指针,而getNextAvailableSpot知道。

只需更改您的声明,警告就会消失。

@interface GameLayer : CCLayer
{
    CCSprite *_background;
    CCPanZoomController *_controller;
    CCLayer *_truckLayer;
}




@class TruckLayer;
@interface GameLayer : CCLayer
{
    CCSprite *_background;
    CCPanZoomController *_controller;
    TruckLayer *_truckLayer;
}

10-06 14:21