область действия события - PullRequest
0 голосов
/ 29 ноября 2008

Дано

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

// остаток кода метода drawPath, который использует значение currentToolType в стате переключателя

}

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

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

Методы действий - единственное место, где currentToolType изменяется. Но, по какой-то причине, похоже, что это currentToolType в mouseUp. Я не писал (и не синтезировал) методы доступа для var, поскольку он используется только сам по себе. Я заметил, что initWithFrame вызывается дважды - я предполагаю, что это для родительского окна и NSView?

Чего мне не хватает?
СПАСИБО!
Это XCode-приложение, основанное на Document, использующее COCOA и Obj-C. Я новичок в обоих.

Ответы [ 2 ]

2 голосов
/ 29 ноября 2008

Вы упоминаете, что initWithFrame: вызывается дважды. Ваш initWithFrame: должен вызываться только один раз (если у вас нет двух представлений Canvas).

Возможно ли, что у вас есть представление Canvas в вашем файле nib / xib, а также создается другое в коде (с помощью alloc / initWithFrame :)?

В этом случае у вас есть два объекта Canvas. Вероятно, один из них подключен к вашим элементам управления, а другой находится в окне (и, таким образом, отвечает на mouseUp: и он каждый раз дает одно и то же значение).

Если у вас есть настройка Canvas View в IB, вы можете решить эту проблему, удалив код, который создает второй.

0 голосов
/ 29 ноября 2008

Вы, вероятно, столкнулись с особым случаем: NSNumber мог иметь кэшированные экземпляры для представления часто используемых чисел.

Два замечания, хотя:

  • Вы тратите впустую много памяти, используя NSNumber, когда вы можете просто использовать NSIntegers или, возможно, старомодный перечислимый тип, полностью избегая накладных расходов объекта.
  • Вы никогда не показывали свой код, когда смотрите на экземпляры NSNumber; без этого здесь недостаточно информации, чтобы ответить на ваш вопрос.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...