2009-08-03 29 views
1

所以,我有一個名爲MazeCell類,這是在「MazeCell.h」Xcode中似乎不希望包括我的課

#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

在格式化你的答案清晰,並確保我的理解它的過程中,我做了一些小的調整,其可能對你有用。我還沒有改變的是 - [MazeCell init]幾乎不做任何事情,因爲在創建對象時,Objective-C實例變量將被初始化爲零。 (而且,您會注意到,0是牆的枚舉值,這是您的默認值 - 即使只是偶然發生,也是很好的選擇。) – 2009-08-04 05:58:09

回答

2

一切對我來說很好。嘗試一個乾淨的和構建。過時的目標文件很可能會浮動,混淆編譯器或鏈接器。

我一直無法檢測到將阻止編譯錯誤,但也有一些明顯的內存泄漏,如setMaze:其中你不釋放舊的迷宮。 (你肯定在-initWithFrame中分配一個迷宮:所以你至少泄漏了那個)。另外,默認的setter語義是「assign」,而不是「retain」或「copy」 - 在這種情況下,它似乎是其中一個後兩種行爲會更有意義。我意識到你對Objective-C是新手,所以這些意味着建設性的反饋,而不是批評。 :-)

1

你忽略了包括這實際上產生的警告的代碼,但它聽起來就像無論它是,你還沒有導入MazeCell.h頭文件。

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(或書面它們的方法),您的任何實例變量。

+0

MazeCell和MazeView確實是不同的類。我只是在代碼中輸入 #import「MazeCell.h」 來證明我確實正在導入MazeCell.h 您的建議不幸沒有奏效。 – Joe 2009-08-03 23:35:04

+0

在你MazeView實現你一個迷宮對象(如在setMaze:(迷宮*)newMaze),看來,它有一個方法getCellInRow:andColumn:ofOrientation實際設置aCell是一個MazeCell。我會確保它返回的實際上是一個MazeCell。 – Neil 2009-08-03 23:53:26