Как использовать NSTimers в качестве ассоциативных ссылок? - PullRequest
1 голос
/ 21 января 2012

Я пробовал следующее:

- (void)setupTimer {    
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
    objc_setAssociatedObject(self, &key, timer, OBJC_ASSOCIATION_RETAIN);
    [timer invalidate];
}

- (void)doSomething { /* ... */ }
- (void)afterDoingSomething { [objc_getAssociatedObject(self, &key) invalidate]; }

Тем не менее, таймер не тикает (я не ожидал, что это произойдет; этот код почему-то не очень мне подходит) по какой-то причине. Есть ли способ заставить его ... работать?

Ответы [ 3 ]

5 голосов
/ 21 января 2012

Вы делаете недействительным таймер сразу после его создания и планирования.Удалите строку [timer invalidate]; в -setupTimer:

- (void)setupTimer {    
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
    objc_setAssociatedObject(self, &key, timer, OBJC_ASSOCIATION_RETAIN);
}

Из документации :

[аннулировать] останавливает приемник когда-либо еще раззапрашивает его удаление из цикла выполнения.

Правильно ли я считаю, что этот код находится в категории?В противном случае я не могу придумать вескую причину сделать таймер ассоциированным объектом, а не просто использовать для него переменную обычного экземпляра.

1 голос
/ 21 января 2012

Вы, наверное, ошиблись invalidate и release.objc_setAssociatedObject делает release для вас при установке следующего элемента.

0 голосов
/ 21 января 2012

Я не думаю, что это проблема с установкой таймера в качестве ассоциативной ссылки.

  1. Вы убиваете таймер до его фактического запуска (invalidate делает так).

  2. Ваш метод - (void)doSomething должен иметь другую подпись: - (void)doSomething: (NSTimer*)theTimer.

  3. У вас может быть утечка памяти, вы должны сделать objc_setAssociatedObject(self, &key, nil, OBJC_ASSOCIATION_RETAIN); в вашем afterDoingSomething.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...