Xcode, похоже, не хочет включать мой класс - PullRequest
1 голос
/ 04 августа 2009

Итак, у меня есть класс с именем 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, а затем замена каждой ссылки на MazeCell на MzCell приводят к запуску этой программы.

Хотя это открывает больше вопросов, чем ответов ...

Ответы [ 3 ]

2 голосов
/ 04 августа 2009

Все выглядит хорошо для меня. Попробуйте очистить и построить. Вполне возможно, что устаревшие объектные файлы плавают вокруг, сбивая с толку компилятор или компоновщик.

Мне не удалось обнаружить ошибку, которая помешала бы компиляции, хотя есть ряд очевидных утечек памяти, таких как в setMaze: когда вы не выпускаете старый лабиринт. (Вы определенно выделяете лабиринт в -initWithFrame: таким образом, вы пропускаете по крайней мере тот.) Кроме того, семантика установки по умолчанию - «назначать», а не «сохранять» или «копировать» - в этом случае может показаться, что последние два поведения будут иметь больше смысла. Я понимаю, что вы новичок в Objective-C, поэтому они подразумевают конструктивную обратную связь, а не критику. : -)

1 голос
/ 04 августа 2009

Вы не включаете код, который фактически генерирует предупреждения, но, похоже, где бы вы ни находились, вы не импортировали заголовочный файл MazeCell.h.

0 голосов
/ 04 августа 2009

Возможно, что объект ('MazeView'), который вы выделяете и инициируете, может не быть объектом 'MazeCell'. Это может быть вызвано тем, что вы пренебрегли импортом MazeCell.h, как упоминал Чак, или просто создали объект «MazeView» с неправильным классом, возможно, в результате копирования и вставки собственного кода (только предположение, которое кажется противоположным интуитивно понятно создать объект типа MazeCell и назвать его «MazeView»).

Я также подозреваю, хотя сейчас у меня нет доступа к XCode для проверки, что ваш typedef может быть объявлен неправильно (или я просто не знаком с этим стилем синтаксиса). Попробуйте заменить ваши 6 строк typedef следующим образом.

typedef enum {
    MazeCellEdgeWall = 0,
    MazeCellEdgeGate = 1,
    MazeCellEdgeExit = 2
} MazeCellEdge;

EDIT: Поскольку вы только что включили файл реализации, я заметил, что он предназначен для MazeView (строка 7), но ваш исходный заголовочный файл предназначен для MazeCell. Итак, на данный момент вы фактически не написали ни одного кода (или не опубликовали), который на самом деле предназначен для объекта MazeCell.

Я также подозреваю, что у вас нет @ synthesize'ed (или написанных для них методов) ни одной из переменных вашего экземпляра.

...