Objective c 事件范围

Objective c 事件范围,objective-c,cocoa,Objective C,Cocoa,给定 在my.h文件中声明 在.m文件中 @interface Canvas:NSView { NSNumber * currentToolType; ... } 再往下 - (id)initWithFrame:(NSRect)frame { self = [super initWithFrame:frame]; if (self) { currentToolType=[[NSNumber alloc]initWithInt:1

给定

在my.h文件中声明 在.m文件中

@interface Canvas:NSView {        
    NSNumber * currentToolType; 
    ...
}
再往下

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        currentToolType=[[NSNumber alloc]initWithInt:1];
    }
    return self;
}
//在开关状态中使用currentToolType值的drawPath方法代码的其余部分

-(void)mouseUp:(NSEvent *)event
{
   NSLog(@"tool value in event: %d",[currentToolType intValue]);
   //rest of code
}

-(NSBezzierPath *)drawPath:(NSRect)aRect
{
   NSLog(@"tool value in draw: %d",[currentToolType intValue]);
动作方法是唯一更改
currentToolType
的地方。但是,出于某种原因,它似乎是
mouseUp
中的
currentToolType
的另一个实例。我没有为var编写(或合成)访问器,因为它只由自己使用。我注意到,
initWithFrame
被调用了两次——我假设它是针对父窗口和NSView的?

我错过了什么?
谢谢

这是一个使用COCOA和Obj-C的XCode生成的基于文档的应用程序。我对这两个方面都不熟悉。

您可能遇到了一个特殊情况:NSNumber可能有缓存实例来表示常用的数字

但有两个观察结果:

  • 当您可以简单地使用NSIntegers或老式的枚举类型时,使用NSNumber会浪费大量内存,完全避免了对象开销
  • 当您查看NSNumber的实例时,从未实际显示过的代码;没有它,这里就没有足够的信息来回答你的问题

您提到initWithFrame:被调用了两次。您的initWithFrame:应该只调用一次(除非您碰巧有两个画布视图)

您是否可能在nib/xib文件中有画布视图,并且正在代码中创建另一个视图(使用alloc/initWithFrame:)

在这种情况下,您有两个画布对象。您可能有一个连接到控件上,另一个在窗口中(从而响应鼠标:每次都给您相同的值)


如果在IB中设置了画布视图,可以通过删除创建第二个画布视图的代码来解决此问题。

具有更多代表性的人应该重新标记此画布视图,因为它实际上与范围或事件无关。Jim。我同意。这个头衔是因为缺乏经验。我可以更改它,因为我问-你会建议一个更相关的标题吗?谢谢吉姆。我使用了一个简单的int-same处理。你问过它是怎么用的。与NSLog状态完全相同。e、 g.开关(currentToolType intValue){case 0:…..等。
}

-(IBAction)selectToolOne:(id)sender
{
   [currentToolType release];
   [currentToolType = [[NSNumber alloc]initWithInt:0];
}

-(IBAction)selectToolTwo:(id)sender
{
   [currentToolType release];
   [currentToolType = [[NSNumber alloc]initWithInt:1];
}