所以,我有一个名为MazeCell的类,它在“MazeCell.h”中声明
#import <Foundation/Foundation.h>
enum {
MazeCellEdgeWall = 0,
MazeCellEdgeGate = 1,
MazeCellEdgeExit = 2
};
typedef NSUInteger MazeCellEdge;
@interface MazeCell : NSObject {
MazeCellEdge left;
MazeCellEdge right;
MazeCellEdge down;
MazeCellEdge up;
NSUInteger drawCount;
NSUInteger row;
NSUInteger column;
}
@property MazeCellEdge left;
@property MazeCellEdge right;
@property MazeCellEdge down;
@property MazeCellEdge up;
@property NSUInteger drawCount;
@property NSUInteger row;
@property NSUInteger column;
- (id)initWithLeft:(MazeCellEdge)newLeft
right:(MazeCellEdge)newRight
up:(MazeCellEdge)newUp
down:(MazeCellEdge)newDown
row:(NSUInteger)newRow
column:(NSUInteger)newColumn;
@end
Xcode会继续为所有方法显示"warning: 'MazeView' may not respond to '-left'"
之类的警告。有趣的是代码在模拟器上运行正常,只是XCode不知道方法。
我满足于忽略这些消息,直到XCode不允许我使用MazeCellEdgeWall
,因为它之前没有被声明(所有这些警告和错误都在不同的类中)。
所以我想知道是否有人看到任何我可能错过的明显错误,因为我是一般的编程新手。
编辑:我最初没有包含代码,因为它很长,但这里的代码是错误的。
这是“MazeCell.m”:
#import "MazeCell.h"
@implementation MazeCell
@synthesize left;
@synthesize right;
@synthesize down;
@synthesize up;
@synthesize drawCount;
@synthesize row;
@synthesize column;
-(id) init {
if (self = [super init]) {
right = MazeCellEdgeWall;
up = MazeCellEdgeWall;
left = MazeCellEdgeWall;
down = MazeCellEdgeWall;
drawCount = 0;
}
return self;
}
- (id)initWithLeft:(MazeCellEdge)newLeft
right:(MazeCellEdge)newRight
up:(MazeCellEdge)newUp
down:(MazeCellEdge)newDown
row:(NSUInteger)newRow
column:(NSUInteger)newColumn
{
if (self = [super init]) {
left = newLeft;
right = newRight;
up = newUp;
down = newDown;
drawCount = 0;
row = newRow;
column = newColumn;
}
return self;
}
@end
这是MazeView.h:
#import "MazeView.h"
#import "MazeCell.h"
#import "NSMutableArray+Stack.h"
#define kCellSidesSize 80.0
@implementation MazeView
@synthesize maze;
@synthesize controller;
@synthesize interfaceOrientation;
- (id)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
interfaceOrientation = UIInterfaceOrientationPortrait;
[self setBackgroundColor:[UIColor greenColor]];
[self setUserInteractionEnabled:YES];
[self setMaze:[[Maze alloc] initWithSize:MazeSizeMake(4, 6)]];
}
return self;
}
- (void)setMaze:(Maze *)newMaze {
maze = newMaze;
CGRect newFrame = [self frame];
newFrame.size = CGSizeMake([newMaze size].width * kCellSidesSize,
[newMaze size].height * kCellSidesSize);
[self setFrame:newFrame];
}
- (void)setInterfaceOrientation:(UIInterfaceOrientation)newOrientation {
if (interfaceOrientation != newOrientation) {
interfaceOrientation = newOrientation;
CGRect oldFrame = [self frame];
[self setFrame:CGRectMake(oldFrame.origin.y, oldFrame.origin.x,
oldFrame.size.height, oldFrame.size.width)];
[[self superview] setContentSize:[self frame].size];
}
}
- (void)setController:(UIViewController *)newController {
if (controller != newController) {
controller = newController;
}
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
NSUInteger columns = [[self maze] size].width;
NSUInteger rows = [[self maze] size].height;
CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextSetLineWidth(context, kCellSidesSize - 2.0);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound);
BOOL isDrawing = NO;
MazeCell *aCell;
NSMutableArray *aStack = [[NSMutableArray alloc] init];
NSUInteger row = 0;
NSUInteger column = 0;
while (YES) {
aCell = [maze getCellInRow:row andColumn:column ofOrientation:interfaceOrientation];
if (isDrawing) {
CGContextAddLineToPoint(context, row * kCellSidesSize + kCellSidesSize / 2.0,
column * kCellSidesSize + kCellSidesSize / 2.0);
} else {
isDrawing = YES;
CGContextMoveToPoint(context, row * kCellSidesSize + kCellSidesSize / 2.0,
column * kCellSidesSize + kCellSidesSize / 2.0);
}
if ([aCell left] == MazeCellEdgeExit && [aCell drawCount] < 1) {
//Warnings and errors
[aCell setDrawCount:1]; //Warning
column--;
} else if ([aCell right] == MazeCellEdgeExit && [aCell drawCount] < 2) {
//Warnings and errors
[aCell setDrawCount:2]; //Warning
column++;
} else if ([aCell up] == MazeCellEdgeExit && [aCell drawCount] < 3) {
//Warnings and errors
[aCell setDrawCount:3]; //Warning
row--;
} else if ([aCell down] == MazeCellEdgeExit && [aCell drawCount] < 4) {
//Warnings and errors
[aCell setDrawCount:4]; //Warning
row++;
} else if ([aStack count] > 0) {
aCell = [aStack pop];
row = [aCell row]; //Warning
column = [aCell column]; //Warning
isDrawing = NO;
} else {
break;
}
}
CGContextStrokePath(context);
[aStack release];
}
@end
同样,这是为了证明我已编码的东西。这个程序有效,正如我所说,迷宫单元方法确实有效,只是Xcode给我警告我不会关心,除了它说我没有定义MazeCellEdgeExit因此不再编译,但它确实编译。
现在这很奇怪。但我发现复制MazeCell.h和MazeCell.m文件并将它们重命名为MzCell.h和MzCell.m,然后用MzCell替换每个对MazeCell的引用都使该程序运行。
虽然这会引发更多问题而不是答案......
答案 0 :(得分:2)
一切对我来说都很好。尝试清洁和构建。过时的目标文件很可能会浮动,使编译器或链接器混乱。
我无法检测到会阻止编译的错误,尽管存在许多明显的内存泄漏,例如在setMaze:你没有释放旧的迷宫。 (你肯定在-initWithFrame中分配一个迷宫:所以你至少泄漏那个。)此外,默认的setter语义是“assign”,而不是“retain”或“copy” - 在这种情况下,它似乎是其中之一后两种行为会更有意义。我意识到你是Objective-C的新手,所以这些都是建设性反馈的意思,而不是批评。 : - )
答案 1 :(得分:1)
您忽略了包含实际生成警告的代码,但听起来就像它在哪里,您还没有导入MazeCell.h头文件。
答案 2 :(得分:0)
你正在分配和初始化的对象('MazeView')可能不是'MazeCell'对象。这可能是因为忽略了像Chuck所提到的那样导入MazeCell.h,或者你只是用错误的类创建了'MazeView'对象,可能是因为复制并粘贴了你自己的代码(只是一个猜测,因为它似乎是反...直观地创建一个MazeCell类型的对象并将其命名为'MazeView')。
我也怀疑,虽然现在没有访问Xcode来测试,你的typedef可能被声明不正确(或者我只是不熟悉那种语法风格)。尝试用这个替换你的6行typedef。
typedef enum {
MazeCellEdgeWall = 0,
MazeCellEdgeGate = 1,
MazeCellEdgeExit = 2
} MazeCellEdge;
修改强> 由于您刚刚包含了实现文件,我注意到它适用于MazeView(第7行),但您的原始头文件适用于MazeCell。截至目前,您实际上还没有编写任何实际用于MazeCell对象的代码(或未发布任何代码)。
我也怀疑你没有@ synthesize'ed(或他们编写的方法)你的任何实例变量。