【问题标题】:event scope事件范围
【发布时间】:2008-11-29 03:16:56
【问题描述】:

给定

@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]);

//在 switch 语句中使用 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 的地方。但是,出于某种原因,它似乎是mouseUpcurrentToolType 的不同实例。我没有为 var 编写(或合成)访问器,因为它仅由它自己使用。我注意到 initWithFrame 被调用了两次 - 我假设它是针对父窗口和 NSView 的?

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

【问题讨论】:

  • 有更多代表的人应该重新命名这个,因为它实际上与范围或事件无关。
  • 吉姆。我同意。标题是因为缺乏经验。我可以更改它,因为我问过 - 对于更相关的标题,你会建议什么?

标签: objective-c cocoa


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    不过有两个观察结果:

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

    【讨论】:

    • 谢谢吉姆。我使用了一个简单的 int - 相同的交易。你问它是如何使用的。与 NSLog 语句完全相同。例如switch (currentToolType intValue]{ case 0:..etc.
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2011-07-07
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2011-10-13
    • 2013-06-15
    相关资源
    最近更新 更多