2009-08-03 2 views
1

그래서, "MazeCell.h"에 선언 된 MazeCell이라는 클래스가 있습니다.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에 이름을 바꾼 다음 MazCell에 대한 모든 참조를 MzCell로 바꾸면이 프로그램을 실행할 수 있다는 것을 알았습니다.

그 대답보다 더 많은 질문을 여는 있지만 ...

+0

명확성을 위해 답을 형식화하고 이해했는지 확인하는 과정에서 유용하게 사용할 수있는 작은 조정을했습니다. 내가 아직 변경하지 않은 점은 Objective-C 인스턴스 변수가 객체가 생성 될 때 0으로 초기화되기 때문에 - [MazeCell init]은 거의 아무 것도하지 않는다는 것입니다. (알 수 있듯이, 0은 벽에 대한 enum 값입니다. 기본값입니다. 우연히 만 선택된 경우입니다.) –

답변

2

모든 것이 나에게 좋을 것 같습니다. 깨끗이하고 빌드하십시오. 오래된 오브젝트 파일이 떠 다니거나 컴파일러 나 링커를 혼란스럽게 할 가능성이 있습니다.

예전의 미로를 공개하지 않는 setMaze와 같은 명백한 메모리 누수가 있지만 컴파일을 방해하는 버그를 감지하지 못했습니다. (당신은 분명히 -initWithFrame에 미로를 할당합니다 : 적어도 그 하나는 누출 될 것입니다.) 또한, 디폴트 설정자 의미론은 "retain"이나 "copy"가 아닌 "assign"입니다 -이 경우, 후자의 두 가지 행동이 더 합리적 일 것이다. 나는 당신이 Objective-C에 익숙하지 않다는 것을 알기 때문에 비평이 아니라 건설적인 피드백을 의미합니다. :-)

+0

코드가 작동하는 동안 이미 재실행했기 때문에 이것이 실제 문제라고 생각합니다. MazeCell 파일 몇 번. 클린과 빌드 같은 것이 있다는 것을 나는 깨닫지 못했다. 고맙습니다. – Joe

+0

문제 없습니다. 컴파일러가 직접 변경 한 파일을 재생성하는 동안 수정하지 않은 코드는 수정 된 코드의 이전 버전 (실제로는 선언 된 모든 메소드가 없을 수도 있음)에 대해 컴파일 될 수 있으므로 경고가 표시됩니다. Xcode 프로젝트 파일 옆의'build' 폴더를 완전히 지울 수 있도록 프로젝트를 구조화합니다. 모든 것이 깨끗하게 재구성 될 것입니다. 이제 다행 이네! :-) –

1

당신은 실제로 경고를 생성하는 것 코드를 포함 무시하지만 어디에 있든, 당신은 MazeCell.h 헤더를 가져 오지 않은 것처럼 소리 파일.

0

alloc'ing 및 init'ing중인 객체 ('MazeView')가 'MazeCell'객체가 아닐 수도 있습니다. 이것은 Chuck이 말한 것처럼 MazeCell.h를 가져 오는 것을 무시하거나 잘못된 클래스로 'MazeView'객체를 만드는 것일 수도 있습니다. 아마도 여러분의 코드를 복사하여 붙여 넣기 한 결과 일 것입니다. MazeCell 유형의 객체를 생성하고 'MazeView'로 이름을 짓는 직관적 인 기능).

Xcode에서 테스트 할 수있는 권한이 없더라도 typedef가 잘못 선언 될 수도 있습니다 (또는 단순히 해당 구문 스타일에 익숙하지 않은 것 같습니다). typedef의 6 줄을 이것을 사용해보십시오.

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

편집 : 방금 구현 파일을 포함했기 때문에 , 나는 그것이 MazeView (7 호선)에 대한,하지만 원래 헤더 파일 MazeCell입니다 것으로 나타났습니다. 따라서 현재 MazeCell 객체 용 코드를 실제로 작성하지 않았거나 게시하지 않았습니다.

또한 @ synthesize'ed (또는 작성된 메소드) 인스턴스 변수가 없다고 의심됩니다.

+0

MazeCell과 MazeView는 실제로 다른 클래스입니다. 나는 코드를 #import "MazeCell.h" 귀하의 권장 안타깝게도 작동하지 않았다는 것을 보여주기 위해 코드에 을 넣으십시오. – Joe

+0

MazeView 구현에서 Maze 객체 (setMaze : (Maze *) newMaze)와 마찬가지로, 실제로 getCellInRow : andColumn : ofOrientation 메서드를 사용하여 aCell을 MazeCell로 설정합니다. 나는 그것이 반환하는 것이 실제로 MazeCell인지 확인합니다. – Neil

+0

그것은 MazeCell을 리턴합니다 – Joe

관련 문제