Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

РЕДАКТИРОВАТЬ:Поскольку вы только что включили файл реализации, я заметил, что он предназначен для MazeView (строка 7), но исходный файл заголовка предназначен для MazeCell.Итак, на данный момент вы фактически не написали (или не опубликовали) никакого кода, предназначенного для объекта MazeCell.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top