2008-12-15 30 views
12

Bir kullanıcı bir düğmeye basarsa veya bir görünümden çıkarsa geçersiz kılmam gereken bir NSTimer nesnesine sahibim. NSTimer zaten geçersiz olup olmadığını nasıl kontrol edilir

Yani var:

[myNSTimer invalidate]; 

benim düğme işleyicisi içinde ve viewWillDisappear içeride. Kullanıcı bir düğmeye basar ve ardından bir görünüm sunarsa, uygulama bir istisna atar çünkü myNSTimer zaten geçersiz hale getirilmiştir. viewWillDisappear yönteminde yapmam gereken şey, myNSTimer'un geçersiz olup olmadığını kontrol etmektir. Bunu nasıl yaparım?

denedim:

if(myNSTimer != nil) 
    [myNSTimer invalidate]; 

ama bu işe yaramadı.

cevap

33

Zamanlayıcıyı geçersiz kıldığınızda, üzerinde release numaralı telefonu arayın (beklediğiniz referansı tuttuğunuzu varsayarak) ve ardından başvurunuzu iptal edin. Bu şekilde, görünümden çıktığınızda, zamanlayıcıyı ikinci kez geçersiz kılmaya çalışmak, bunun yerine nil'de bu yöntemi çağırır, bu hiçbir şey yapmaz.

Alternatif olarak, geçersiz kılmadan önce geçerli olup olmadığını kontrol etmek için -[NSTimer isValid]'u kullanabilirsiniz, ancak yine de ilk kez geçersiz kıldıktan sonra referansınızı tutmanız için hiçbir neden yoktur. Ayrıca, asıl sorununuz referansınızı korumamış olmanız ve ilk -invalidate'un aslında bırakılan bir nesneyi işaret eden bir referans ile kalmasını sağlamanız durumunda, -isValid numaralı telefonu aramanız yine de yardımcı olmayacaktır.

+0

teşekkürler! –

+0

Bu açık bir açıklama. Teşekkürler! –

+0

Bu, "mesajım ayrılmamış örnek" sorununa gönderdiğim çözüm için tam olarak bir çözümdü. Teşekkürler. – High6

6

Genelde yaptığım şey, zamanlayıcıyı tuttuğunda veya geçersiz kıldığım zamanlayıcıyı tutan üye değişkeni sıfırlar. Daha sonra,

ve doğru olanı yaparsınız.

3

& zamanlayıcıyı yeniden başlatmaya çalışırken aynı sorunu yaşadım. Bunu durdurmak için:

[timer invalidate]; 
[timer release]; 
timer = nil; 

Ve başlatmak için/yeniden başlatın:

timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain]; 

bunu geçersiz olduğunda Şimdi çökmez.

1

Swift: Cevabınız için

if timer.valid { 
    timer.invalidate() 
}