事件范围

时间:2008-11-29 03:16:57

标签: objective-c cocoa

给出

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

在我的.h文件中声明 并在.m文件中

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        currentToolType=[[NSNumber alloc]initWithInt:1];
    }
    return self;
}

并进一步向下

-(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值的drawPath方法代码的其余部分

}

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

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

操作方法是currentToolType更改的唯一位置。但是,出于某种原因,它似乎是currentToolTypemouseUp的不同实例。我没有为var编写(或合成)访问器,因为它只用于自身。我注意到initWithFrame被调用了两次 - 我假设它是用于父窗口和NSView?

我错过了什么?
谢谢! 这是使用COCOA和Obj-C生成的基于XCode文档的应用程序。我两个都是新人。

2 个答案:

答案 0 :(得分:2)

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

你是否有可能在你的nib / xib文件中有Canvas视图,并且还在代码中创建另一个(使用alloc / initWithFrame :)?

在这种情况下,您有两个Canvas对象。你可能有一个连接到你的控件,另一个在窗口中(因此响应mouseUp:它每次都给你相同的值)。

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

答案 1 :(得分:0)

你可能遇到过一个特例:NSNumber可能有缓存的实例来表示常用的数字。

但有两点意见:

  • 当您只是使用NSIntegers或者可能是一个老式的枚举类型时,使用NSNumber浪费了大量内存,完全避免了对象开销。
  • 当你查看NSNumber的实例时,你从未真正展示过你的代码;没有它,这里没有足够的信息来回答你的问题。