Почему мой селектор Какао на самом деле не вызывается? - PullRequest
2 голосов
/ 07 февраля 2012

Я в тупике.У меня нет никаких ошибок или даже предупреждений.Я устанавливаю точку останова в строке, которая ее вызывает, и программа останавливается на этом, но когда я устанавливаю точку останова внутри фактического кода для этого селектора, программа не останавливается.Селектор, который меня интересует, это 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];).

1 Ответ

2 голосов
/ 07 февраля 2012

puzzleInstance вероятно nil (0x0 в списке наблюдения, как вы заметили: nil - это еще одно причудливое имя для адреса памяти 0).Это будет иметь место, если вы создадите экземпляр SPPuzzleView из файла XIB, поскольку механизм загрузки вызывает initWithCoder: (затем awakeFromNib) вместо initWithFrame:, оставляя puzzleInstance неинициализированным.

...