NSTimer Nicht Zu Stoppen, Wenn Ungültig
Ich habe folgenden code in meiner .h-Datei:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <AVFoundation/AVFoundation.h>
#import <MapKit/MapKit.h>
@interface LandingController : UIViewController<CLLocationManagerDelegate> {
CLLocationManager *LocationManager;
AVAudioPlayer *audioPlayer;
}
@property (nonatomic, retain) NSTimer *messageTimer;
- (IBAction)LoginButton:(id)sender;
@end
Ich habe folgenden code in meiner .m-Datei:
@interface LandingController ()
@end
@implementation LandingController
@synthesize messageTimer;
- (void)checkForMessages
{
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"BINGO:"
message:@"Bingo This Works"
delegate:nil
cancelButtonTitle:@"Okay"
otherButtonTitles:nil];
[alert show];
}
- (IBAction)LoginButton:(id)sender {
if ([UserType isEqualToString:@"Owner"]) {
if (messageTimer){
[self.messageTimer invalidate];
self.messageTimer = nil;
}
} else {
if (!messageTimer){
self.messageTimer = [NSTimer scheduledTimerWithTimeInterval:10.0
target:self
selector:@selector(checkForMessages)
userInfo:nil
repeats:YES];
}
}
}
@end
Aber mein timer nicht wollen, zu stoppen, wenn ich den Anruf entkräften.
Den LoginButton ist nur zweimal hintereinander gedrückt, einmal, wenn die strResult ist = auf "Guard" und dann die Anwendung änderungen, die es zu gleich "Besitzer" und der Benutzer drückt die Schaltfläche "login" wieder, so dass ich nicht denke, ich werde mehrere Timer.
Nach drücken der Schaltfläche "login", und starten Sie die timer-I übergang zu einer anderen Ansicht und dann Wechsel zurück zu drücken Sie die Schaltfläche "login" einmal mehr die ist, wenn ich will, den timer zu stoppen. Muss ich etwas besonderes tun, um die messageTimer da ich umgestiegen Blick für einen moment und kam dann zurück?
Irgendwelche Ideen?
Dank!
- Wo hast du geschrieben scheduledTimerWithTimeInterval code ? Check das, es muss immer initialisiert, auch wenn Sie ungültig es.
- Ich habe es geschrieben, innerhalb einer if-Schleife, die nur einmal in der Anwendung, so dass ich nicht denke, es wird re-initialisiert.
- Ich habe in mehrere code - siehe oben
- Könnten Sie überprüfen, ob der Wert von [self.messageTimer isValid] NICHT, bevor Sie selbst.messageTimer zu null?
- Gerade Hinzugefügt mehr code, so etwas wie, dass?
- Nach dem hinzufügen in diesem code hat es jetzt aber die Kugel trifft den code ungültig. Wenn nach der Einstellung des Timers durch drücken der I-Taste Reihenfolge zu einer anderen Ansicht und dann Wechsel zurück zu dieser Ansicht, und drücken Sie die Taste erneut, benötige ich die messageTimer Wert einen anderen Weg?
- Könnten Sie fügen Sie diesen code in Ihre viewController: -(void)dealloc {[self.messageTimer invalidate]; self.messageTimer = null;} und sehen, ob es hilft?
- Was soll das bringen?
- Es wird, erlischt die timer, wenn Sie Ihren viewController freigegeben wird. Ich möchte nur sicherstellen, dass es nicht ein timer-Leck.
- Ich habe es, aber es schien nicht, etwas zu ändern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie rufen Sie
[self.messageTimer invalidate]
auf dem gleichen thread, auf dem Sie erstellt den timer. Stellen Sie nur sicher, dass der timer erstellt wird und für ungültig erklärt Haupt-thread.NSTimer bleibt NSRunLoop, so dass der einzige Weg, ich sehe dein Problem passiert, wenn Sie tatsächlich die Schaffung von mehr als einem timer und ungültig zu machen nur das, was Sie haben, verweisen.
Beispiel:
ViewDidLoad
undViewWillAppear
). Danke!Haben, die Sie versuchen, zu wiederholen, wie Kein
Wenn der code am Ende (beginnend mit if) genannt wird zweimal mit UserType != Besitzer, erstellen Sie einen neuen timer, ohne ungültig, die alten. Nun zwei Timer laufen. Wenn der Programmcode ausgeführt wird, ein drittes mal, fügen Sie eine Dritte Zeitschaltuhr und so weiter. Ausführen von code mit UserType == Inhaber nur, erlischt die Letzte timer-und auch heißt es repeatly, es spricht nicht gegen eine ältere Timer.
Haben Sie eine timer-Leck. 😉
NSTimer
freigegeben wird. Schicken Sie-invalidate
.Wie etwa das setzen einer
NSLog
in IhremcheckForMessages
Methode? Es wäre einfacher, um zu überprüfen, ob es wirklich nur 1 timer.(Würde ich eher dies in einem Kommentar, aber ich habe nicht so viel Ruf....)
Habe ich einen Zugang zum anhalten oder deaktivieren Sie den timer, Bevor Sie diese anwenden stellen Sie sicher, dass Sie versucht, alle Fälle, wie oben erwähnt, so können Sie auch verstehen, warum dieser Ansatz verwendet, bei letzten.
So, wenn der Fall aufgetreten, dass der timer nicht stoppen, dann die Eingabe in diesem code der timer wird permanent hält.
Seine seltsam, aber ungültig zu übergeben timer Referenz und erstellt timer Referenz für mich gearbeitet.