2012-02-07 4 views
2

나는 뒤죽박죽이다. 나는 어떤 오류 또는 경고도하지 않는다. 나는 그것을 호출하는 줄에 중단 점을 설정하고 프로그램이 멈추지 만, 그 선택자의 실제 코드 안에 중단 점을 설정하면 프로그램이 멈추지 않습니다. 걱정되는 셀렉터는 toggleCellAtX:Y:입니다. 여기 SPPuzzle.m가있다 : 여기왜 내 코코아 선택기가 실제로 호출되지 않습니까?

#import "SPPuzzle.h" 

@implementation SPPuzzle 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     int x, y; 
     for (y=0; y<3; y++) 
      for (x=0; x<3; x++) { 
       cells[x][y] = FALSE; 
      } 
    } 

    return self; 
} 

- (BOOL)cellOnAtX:(int)x Y:(int)y { 
    return cells[x][y]; 
} 

- (void)toggleCellAtX:(int)x Y:(int)y { 
    cells[x][y] = !cells[x][y]; // Breakpoint here doesn't stop program. 
} 

@end 

을 그리고 것은 SPPuzzleView.m이다 : 나는 브레이크 포인트가 어디에 보여 주석을 추가

#import "SPPuzzleView.h" 

@implementation SPPuzzleView 

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     puzzleInstance = [[SPPuzzle alloc] init]; 
    } 

    return self; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    int x, y; 

    for (y=0; y<3; y++) 
     for (x=0; x<3; x++) { 
      if ([puzzleInstance cellOnAtX:x Y:y]) { 
       [[NSColor greenColor] set]; 
      } else { 
       [[NSColor redColor] set]; 
      } 

      [[NSBezierPath bezierPathWithRect:NSMakeRect(100*x, 100*y, 100, 100)] fill]; 
      [[NSColor blackColor] set]; 
      [[NSBezierPath bezierPathWithRect:NSMakeRect(100*x, 100*y, 100, 100)] stroke]; 
     } 
} 

- (void)mouseDown:(NSEvent *)theEvent { 
    int x = (int)[theEvent locationInWindow].x/100; 
    int y = (int)[theEvent locationInWindow].y/100; 

    [puzzleInstance toggleCellAtX:x Y:y]; // Breakpoint here does stop program. 
    [self setNeedsDisplay:TRUE]; 
} 

@end 

. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

그런데이 메소드를 호출 할 때 Step Into를 사용했지만 다음 줄 ([self setNeedsDisplay:TRUE];)으로 넘어갑니다. (당신이 언급 한 바와 같이, 감시 목록에 0x0 : nil는 메모리 주소 0에 대한 또 다른 멋진 이름)

+2

'puzzleInstance'가'nil'이 아닌지 확인하십시오. 이는 IIRC가'initWithFrame :'대신'initWithCoder :','awakeFromNib'를 호출하기 때문에 xib에서 뷰가 인스턴스화 된 경우에 발생합니다. 그것은 장거리지만, 작동한다면, 그냥 말하면 대답으로 다시 게시 할 것입니다. – zneak

+0

@zneak 이것은 장황한 것이 아니라 거의 확실하게 문제입니다. – dasblinkenlight

+0

그래, 그건 괜찮아, 내가 생각하는 건 감시 목록의 0x0가 무엇을 의미하는지. 알았다. 감사! – flarn2006

답변

2

puzzleInstance 아마 nil입니다. XIB 파일에서 SPPuzzleView을 인스턴스화 한 경우 대신 initWithCoder: (다음은 awakeFromNib)이 호출되고 puzzleInstance은 초기화되지 않은 채로 남아 있기 때문에 이러한 경우가 될 수 있습니다.

+0

그걸 수정했습니다. 감사! 다만 궁금해하는 : 왜 프로그램이 segfault 또는 무엇이든과 충돌하지 않을 것입니까? 또한, 경고가 있어야한다는 것은 쉬운 실수입니다. – flarn2006

+0

이것이 ObjectiveC의 사양입니다. 'nil' 메소드를 호출하면 메소드는'nil'을 리턴합니다. 여러분이 익숙해지면 많은 상황에서 편리해질 것입니다. 실제로 0 번과 같은 의미에서 직관적입니다. – barley

+0

@ flam2006, 'nil'에 대한 메소드 호출은 아무 것도하지 않고 제로 값을 반환합니다. 메소드의 리턴 유형. 즉, 값이 숫자 형일 경우 0을 얻습니다 (포인터를 반환하는 메서드 포함). 값이 구조체 또는 공용체 유형일 경우 0으로 채워진 구조가됩니다. – zneak

관련 문제