2009-08-03 3 views
1

を含めるしたくないようだ、私はXcodeのは、すべてのメソッドの"warning: 'MazeView' may not respond to '-left'"のような警告を表示し続ける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 

「MazeCell.h」で宣言されているMazeCellというクラスを持っています。面白いのは、コードがシミュレータ上でうまく動作することです.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に名前を変更し、MazCellのすべての参照をMzCellに置き換えると、このプログラムが実行されることを発見しました。

それはそれは答えよりも多くの質問を開きますが...

+0

答えを明確にして理解していることを確認する過程で、私は役に立つと思われる小さな調整を行いました。私がまだ変更していないものは、Objective-Cインスタンス変数がオブジェクトの作成時に0に初期化されるため、[MazeCell init]はほとんど何もしません。 (あなたが気づくように、0は壁の列挙値で、デフォルトでは偶然によってもうまく選択されています) –

答えて

2

すべてがうまく見えます。きれいにしてビルドしてください。時代遅れのオブジェクトファイルが浮動し、コンパイラやリンカを混乱させる可能性があります。

コンパイルを妨げるバグを検出できませんでしたが、setMazeのようないくつかの明らかなメモリリークがあります。古いミーゼを解放しない場合です。 (あなたは間違いなく迷路を-initWithFrameに割り当てます:少なくとも1つは漏れてしまいます。)また、デフォルトセッターセマンティックは、 "retain"や "copy"ではなく "assign"です - この場合、後者の2つの振る舞いはより理にかなっています。私はあなたがObjective-Cの初心者であることを理解しています。だから、これは建設的なフィードバックであり、批判ではありません。 :-)

+0

私はすでにコードが動作していますが、 MazeCellファイルを数回。私はクリーンとビルドのようなものがあったことを認識しませんでした。ありがとうございました。 – Joe

+0

問題ありません。コンパイラはあなたが直接変更したファイルを再生成しますが、変更していないコードは修正されたコードの古いバージョン(おそらくこれらのメソッドが宣言されていない可能性があります)に対してコンパイルされる可能性があります。私は自分のプロジェクトを構造化して、Xcodeプロジェクトファイルの隣にある 'build'フォルダを完全に削除することができ、すべてがきれいに再構築されます。あなたはそれが今働いてうれしい! :-) –

1

あなたが実際に警告を生成するのコードが含まれるように無視、しかし、それはどこに、あなたがMazeCell.hヘッダをインポートしていないように聞こえますファイル。

0

あなたが割り当ててinit'ingしているオブジェクト( 'MazeView')が 'MazeCell'オブジェクトではない可能性があります。これは、Chuckが言及したようにMazeCell.hをインポートすることを無視するか、またはあなた自身のコードをコピーして貼り付けた結果として、誤ったクラスを持つ 'MazeView'オブジェクトを作成するだけです(ちょっと推測すると、 MazeCellタイプのオブジェクトを作成して名前を 'MazeView'にすることは直感的です)。

また、Xcodeでテストするためのアクセス権がないのに、あなたのtypedefが間違って宣言されている可能性があります(または、私はその構文スタイルに慣れていない可能性があります)。 typedefの6行をこれに置き換えてみてください。

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

EDIT:あなただけの実装ファイルが含まれているので が、私はそれがMazeView(7行目)のためですが、あなたのオリジナルのヘッダファイルがMazeCellのためであることに気づきました。だから今のところ、実際にMazeCellオブジェクト用のコードは書かれていない(または投稿されていない)。

また、@ synthesize'ed(またはそれらのための記述されたメソッド)のインスタンス変数がないと思われます。

+0

MazeCellとMazeViewはまったく異なるクラスです。私は単純に #import "MazeCell.h" をインポートしたことを示すコードに をコードに入れました。あなたのお勧めは残念ながらうまくいきませんでした。 – Joe

+0

MazeViewの実装では、Mazeオブジェクト(setMaze:(Maze *)newMaze)のように、実際にaCellをMazeCellに設定するgetCellInRow:andColumn:ofOrientationメソッドがあるようです。私はそれが返すものが実際にはMazeCellであることを確認するでしょう。 – Neil

+0

それはMazeCellを返します – Joe