NSTimer als Property ? Warum funktioniert dieser Code nicht ?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSTimer als Property ? Warum funktioniert dieser Code nicht ?

    Hallo Zusammen,

    ich versuche in einem ViewController ein NSTimer-Objekt zu nutzen. Leider funktioniert es nicht. Was ist denn hier falsch ? :(

    Im Header des ViewControllers habe ich eine Property angelegt:

    Quellcode

    1. @property (strong, nonatomic) NSTimer *myTimer;

    In der Implementierungsdatei starte ich und beende ich den Timer in verschiedenen Methoden:

    Quellcode

    1. -(void) switchOffButtonsAndTimer {
    2. for (UIButton *button in self.myCollectionOfButtons) {
    3. button.enabled = NO;
    4. }
    5. [self.myTimer invalidate];
    6. }
    7. - (void) switchOnButtonsAndTimer {
    8. for (UIButton *button in self.myCollectionOfButtons) {
    9. button.enabled = YES;
    10. }
    11. self.myTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerRunning) userInfo:nil repeats:YES];
    12. }
    13. - (void) timerRunning {
    14. NSLog(@"Timer runs ...");
    15. }
    Alles anzeigen


    Ich habe keine Fehlermeldungen des Compiler, aber: Leider wird das "Timer runs" nie geloggt ! :(

    Vielen Dank an alle, die sich die Zeit nehmen ! :)

    LG
    aus München
    Meine Signatur: Wir sehen die Welt nicht wie sie ist, sondern wie wir sind ! :huh:
  • Der Parameter NSTimer halt. Sonst fragt er hier noch irgendwann, wie der den Timer bekommt, der da gerade feuert ;)

    Ausserdem sagt das die Doku so. Ich weiss nicht, was passiert, wenn ein parameterloser Selektor gefeuert wird.
    Edit: Okay, es passiert nichts besonderes (grade Testprojekt angelegt). Aber naja.
  • Für einmal feuernde kein Problem bei Repeating Timers empfiehlt sich das die Timer Referenz mitzugeben so kann man ihn in der Methode invalidieren sobald er nichtmehr gebraucht wird.
  • matz schrieb:

    Alves schrieb:

    Und deine Selektormethode sollte eigentlich noch so aussehen:

    Quellcode
    1
    - (void)name:(NSTimer *)timer


    Warum?


    weils die doku sagt (ja, es läuft auf einigen (nur um nicht "alle" zu sagen) systemen auch mit einer methode die kein argument erwartet:

    aSelector
    The message to send to target when the timer fires. The selector must have the following signature:
    - (void)timerFireMethod:(NSTimer*)theTimer
    The timer passes itself as the argument to this method.

    und in der aktuellen doku:

    aSelector
    The message to send to target when the timer fires. The selector must correspond to a method that returns void and takes a single argument. The timer passes itself as the argument to this method.

    edit: smilies deaktiviert!
  • If the number of arguments does not equal the number of parameters, the behavior is undefined.

    Der Compiler kann also ein Programm bauen, welches sich auf beliebige Weise verhält einschließlich "korrekt".

    Aber das ist nur C und Funktionen. Bei Objective-C ist es etwas komplizierter:

    Eine Nachricht wird in einen Aufruf einer Funktion des Laufzeitsystems übersetzt, der – nach id, SEL – eine offene Parameterliste hat. Das bedeutet, dass der Aufruf dieser Funktion mit einer beliebigen Anzahl an Argumenten syntaktisch korrekt ist. Das Laufzeitsystem muss daraus wieder dynamisch eine Parameterliste bauen. Das geht in C mit Standardmitteln gar nicht. Insofern ist es müßig darüber zu reden, was passiert. Am besten ist es, man macht es einfach richtig.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?