gpt4 book ai didi

objective-c - 为什么我的 Cocoa 选择器实际上没有被调用?

转载 作者:行者123 更新时间:2023-12-03 16:38:21 26 4
gpt4 key购买 nike

我被难住了。我没有任何错误,甚至警告。我在调用它的行设置了一个断点,程序在那里停止,但是当我在该选择器的实际代码中设置断点时,程序不会停止。我关心的选择器是 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];)。

最佳答案

puzzleInstance 可能是 nil (监视列表中的 0x0,正如您所指出的:nil 只是另一个内存地址的奇特名称0)。如果您从 XIB 文件实例化 SPPuzzleView ,就会出现这种情况,因为加载机制调用 initWithCoder: (然后是 awakeFromNib)而不是 initWithFrame:,让您的 puzzleInstance 未初始化。

关于objective-c - 为什么我的 Cocoa 选择器实际上没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9170583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com