سؤال

لدي فئة تسمى MazeCell التي أعلنت في "MazeCell.ساعة"

#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

كسكودي تحافظ عرض تحذيرات مثل "warning: 'MazeView' may not respond to '-left'" على كل الطرق.الشيء المضحك هو أن الكود يعمل بشكل جيد على جهاز محاكاة ، إنه فقط كسكودي لا يعرف الطرق.

لقد كان المحتوى تجاهل الرسائل حتى كسكودي لن اسمحوا لي أن استخدام MazeCellEdgeWall لأنه لم يكن قد أعلن في وقت سابق (كل هذه التحذيرات والأخطاء في فئات مختلفة).

لذلك أنا أتساءل عما إذا كان أي شخص يرى أي الصارخ الأخطاء التي كنت قد أخطأت لأن انا جديد على البرمجة بشكل عام.


تحرير: لم أكن في الأصل تشمل رمز لأنه طويل ولكن هنا هو رمز العطاء الأخطاء.

هنا هو "MazeCell.م":

#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

مرة أخرى, هذا بشرط أن يثبت أن لدي ترميز الأشياء.يعمل هذا البرنامج و كما قلت المتاهة الخلية أساليب فعلا العمل ، إنه فقط كسكودي يعطيني التحذيرات التي لا تهتم إلا أنه يقول لم يعرف MazeCellEdgeExit و حتى لا تجمع بعد الآن, ولكنها لا تجمع على خلاف ذلك.


الآن هذا أمر غريب جدا.لكني اكتشفت أن تكرار MazeCell.ح و MazeCell.m الملفات و إعادة تسميتها إلى MzCell.ح و MzCell.م ، ثم استبدال كل إشارة إلى MazeCell مع MzCell حصلت على هذا البرنامج لتشغيل.

على الرغم من أن يفتح أسئلة أكثر من الأجوبة عليه...

هل كانت مفيدة؟

المحلول

كل شيء يبدو جيدا بالنسبة لي.محاولة نظيفة و بناء.فمن الممكن جدا أن عفا عليها الزمن كائن الملفات تطوف ، مربكا المترجم أو رابط.

لم أكن قادرة على الكشف عن الخلل الذي من شأنه أن يمنع تجميع, على الرغم من أن هناك عدد من ظاهرة تسرب الذاكرة ، مثل في setMaze:حيث لم يكن الإصدار القديم المتاهة.(أنت بالتأكيد تخصيص متاهة في initWithFrame:لذا تسرب على الأقل هذا واحد.) أيضا ، الافتراضي اضع الدلالي هو "تعيين" لا "الاحتفاظ" أو "نسخة" — في هذه الحالة ، يبدو أن واحدة من الأخيرتين السلوكيات من شأنها أن تجعل أكثر منطقية.أنا أدرك أنك جديدة على الهدف-C, لذلك هذه هي يعني عن طريق التغذية الراجعة البناءة ، وليس النقد.:-)

نصائح أخرى

يمكنك إهمال إدراج التعليمات البرمجية هذا في الواقع توليد تحذيرات لكن يبدو أينما كان ، لم المستوردة MazeCell.ح رأس الملف.

فمن الممكن أن الكائن ('MazeView') أنت الوك و التعرف على الحرف الأول يعود إلى فترة قد لا يكون 'MazeCell' الكائن.هذا قد يكون ناجما عن إهمال استيراد MazeCell.ح كما تشاك ذكر أو ببساطة إنشاء 'MazeView' الكائن مع الصف الخطأ ربما نتيجة نسخ و لصق التعليمات البرمجية الخاصة بك (مجرد تخمين ، كما يبدو غير بديهية لخلق كائن من MazeCell نوع و اسم 'MazeView').

أظن أيضا ، وإن لم يكن لديك الوصول الآن إلى كسكودي لاختبار الخاص بك typedef قد أعلن بشكل غير صحيح (أو أنا ببساطة لم تكن مألوفة مع أن الجملة نمط).حاول استبدال الخاص بك 6 خطوط الرموز المميزة ل typedef مع هذا.

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

تحرير: منذ لديك فقط شملت تنفيذ الملف, لقد لاحظت أن يفعل MazeView (سطر 7), ولكن الأصلي الخاص بك ملف الرأس هو MazeCell.وذلك من الآن, كنت في الواقع لم أكتب أي رمز (أو عدم نشر أي) التي هي في الواقع عن MazeCell الكائن.

أنا أيضا الشك في أنك لم @تجميع رائد (أو مكتوبة أساليب منهم) أي من المتغيرات سبيل المثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top