2012-02-13 32 views

Odpowiedz

36

Nie można użyć unieważnionego licznika czasu.

od Apple Docs:

Po zaplanowano na pętli biegu, pożary czasomierza w określonym przedziale dopóki nie zostanie unieważniony. Nieodtwarzający się zegar unieważnia natychmiast po uruchomieniu. Jednak w przypadku powtarzającego się zegara użytkownik musi samodzielnie unieważnić obiekt czasomierza, wywołując jego unieważnioną metodę: . Wywołanie tej metody wymaga usunięcia timera z bieżącej pętli prądowej ; w związku z tym należy zawsze wywoływać metodę unieważniającą z tego samego wątku, w którym zainstalowano timer. Unieważnienie licznika powoduje natychmiastowe wyłączenie go, dzięki czemu nie ma już wpływu na pętlę uruchamiania. Pętla uruchamiania następnie usuwa i zwalnia timer, albo tuż przed powrotem metody unieważniającej, albo w pewnym późniejszym punkcie . Po unieważnieniu obiekty timera nie mogą być ponownie użyte.

+0

Interesujące jest to, że istnieje addTimer NSRunLoop, ale nie ma metody removeTimer, która mogłaby być użyta do zatrzymania stopera od wystrzelenia bez unieważniania go. Musi być tak, że tworzenie zegara jest tańsze niż tworzenie portów, więc jabłko nie zawracało sobie głowy dodawaniem tego api. –

13

Po unieważnieniu NSTimer nie powinieneś używać go ponownie.

Zamiast tego utwórz nową instancję licznika czasu i użyj tej instancji, aby dodać do metody addTimer NSRunLoop. Osobiście wolę po prostu wywoływać zaplanowanyTimerWithTimeInterval NSTimer, ponieważ robi wszystko w jednym ujęciu.

Od NSTimer docs:

Wywołanie tej metody żąda usunięcia timer z pętli prądowej run; w związku z tym należy zawsze wywoływać metodę unieważniającą z tego samego wątku, w którym zainstalowano timer. Unieważnienie wartości powoduje natychmiastowe wyłączenie licznika czasu, tak aby nie wpływało już na przebieg pętli. Pętla uruchamiania następnie usuwa i zwalnia timer, albo po prostu przed zwróceniem metody unieważnienia lub w jakimś późniejszym punkcie. Po unieważnieniu obiekty timera nie mogą być ponownie użyte.

+0

Dobra, nie wiedziałem tego ... Dzięki! – TheAmateurProgrammer

Powiązane problemy