Question

J'ai configuré deux minuteurs dans mon application, qui se répètent toutes les quelques secondes. Tout fonctionne bien sauf quand il est temps d'invalider les minuteries. Lorsque le téléphone est verrouillé, je souhaite invalider ces minuteries, puis les recréer lorsque le téléphone est déverrouillé.

J'utilise les notifications pour savoir quand invalider / créer les minuteries.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_didBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notify_willResigneActive:) name:UIApplicationWillResignActiveNotification object:nil];

Voici ce que contient la méthode notify_didBecomeActive:

clockTicker = [[NSTimer scheduledTimerWithTimeInterval: 1  
                                            target: self  
                                          selector: @selector(showActivity)  
                                          userInfo: nil  
                                           repeats: YES] retain];

alarmTicker = [[NSTimer scheduledTimerWithTimeInterval: CONST_ALARMTIMER  
                                               target: self  
                                             selector: @selector(checkAndLaunchAlarm)  
                                             userInfo: nil  
                                              repeats: YES] retain];

La méthode notify_willResigneActive contient:

if (alarmTicker) {
    [alarmTicker invalidate];
    [alarmTicker release];
    alarmTicker = NULL;
}

if (clockTicker) {
    [clockTicker invalidate];
    [clockTicker release];
    clockTicker = NULL;
}

Le problème est que lorsque je corrige cette erreur sur la seconde minuterie, j'obtiens l'erreur. Ce qui est étrange, c’est que si je change les ordres des minuteries (comme d’abord invalider le clockTicker), il me reste l’erreur sur le second minuteur.

Que pourrais-je faire de mal?

Merci, Leonardo

Était-ce utile?

La solution

invalidate libère la minuterie, pas besoin de relâcher après invalidation, c’est pourquoi il se bloque. Mais je viens de remarquer que vous conservez la minuterie ... Je ne suis pas sûr que cela soit nécessaire non plus.

Autres conseils

Il vous suffit de régler alarmTicker et clockTicker sur nil dans les méthodes activées par ces minuteries pour que vous puissiez vérifier si (alarmTicker) ou si (clockTicker) ont la bonne valeur.

Je ne suis pas sûr de ce que le réglage de la minuterie sur NULL opère par opposition à la définition de zéro, mais je sais que si vous passez un appel sur un objet nul, il s'agit d'un non-op. Si vous effectuez un appel sur un objet NULL, il pense qu'il se bloque, bien que je ne l'aie pas encore vérifié. Ce message pourrait vous aider: NULL vs nil dans Objective-C

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top