edit2:我重组所有标题以具有@class,而不是#IMPORT语言。所有.m文件现在都有#import。这里发布的问题似乎是解决的。现在有一些不良的访问错误,但是虽然可能是所有相同的根问题,但这种表现已解决
编辑:我刚刚发现了一种称为"导入循环"的东西。我正在研究这个问题。如果有人有任何信息,请告诉我。
无关的更改导致了不可能的错误 - 我认为程序中其他地方有一些更深的错误或一些错误,但我只想确认是这种情况。我有3个错误,并且已经在不同的Xcode项目中重建了程序。我有一些代码示例,但不要担心 - 它们(主要是)标题文件
错误1
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "PixelSprite.h"
#import "HUDLayer.h"
#import "PixelCharacter.h"
/*typedef enum
{
GameSceneLayerTagGame = 1,
GameSceneLayerTagHUD
}GameSceneLayerTags;*/
@interface GameLayer : CCLayer {
}
@property (assign,readwrite) CGPoint heroStartPoint;
@property (nonatomic, retain) CCTMXTiledMap *tileMap;
@property (nonatomic, retain) CCTMXLayer *background;
@property (assign, readwrite) NSInteger scrollSpeed;
@property (assign, readwrite) PixelCharacter *heroCharacter;
上线包含一个编译器错误:未知类型名称" Pixelcharacter"。我知道没有拼写错误。我什至要复制类和标题文件的贴合名称,只是为了确保
+(GameLayer *) sharedGameLayer;
-(id) init;
@end
错误2
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "HUDButton.h"
@interface HUDLayer : CCLayer {
}
@property (readwrite,assign) CCArray* buttonsArray;
// Working with the buttons
-(void) addHUDButtonOfType:(NSString*)type inSlot:(int)slot;
-(void) addHUDButtonOfType:(NSString*)type;
-(void) removeHUDButton:(HUDButton*)button;
上线包含一个编译器错误:预期类型这是没有道理的,因为类型清楚地发布
-(void) removeHUDButtonOfType:(NSString*)type;
-(void) removeAllButtons;
-(void) buttonsQuery;
@end
错误3
-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
// Get touch location
CGPoint location = [touch locationInView:[touch view]];
location = [[CCDirector sharedDirector] convertToGL:location];
// Verify that touch is on button
BOOL isTouchHandled = CGRectContainsPoint([buttonSprite boundingBox], location);
if (isTouchHandled) {
[buttonSprite setColor:ccRED];
SEL selector = NSSelectorFromString(actionMessage);
GameLayer* layer = [GameLayer sharedGameLayer];
PixelCharacter* heroCharacter = [layer heroCharacter];
上线包含一个编译器警告:不兼容的指针类型初始化" PixelCharacter *",并表达'int *'
的表达 [heroCharacter addToDoQueue:selector];
}
return isTouchHandled;
}
问题是循环导入依赖项。
显然,.h文件中的#import有时会通过使编译器认为所有必要的标头在实际取决于编译顺序时会导入所有必要的标题来"掩盖"问题。解决方案和最佳实践是使用
@class MyClass
在标题和
中#import "MyClass.h"
在.m