2008-12-15 45 views
12

Tôi có đối tượng NSTimer mà tôi cần phải vô hiệu nếu người dùng nhấn vào nút hoặc nếu họ thoát chế độ xem.Cách kiểm tra xem NSTimer đã bị vô hiệu hóa chưa

Vì vậy, tôi có:

[myNSTimer invalidate]; 

bên handler nút của tôi và bên trong viewWillDisappear. Nếu người dùng chạm vào nút và sau đó tồn tại chế độ xem, ứng dụng sẽ ném ngoại lệ vì myNSTimer đã bị vô hiệu. Những gì tôi cần làm trong phương pháp viewWillDisappear là kiểm tra xem myNSTimer có bị vô hiệu hay không. Làm thế nào để làm điều đó?

Tôi đã thử:

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

nhưng điều đó không làm việc.

Trả lời

33

Sau khi bạn vô hiệu hóa bộ hẹn giờ, chỉ cần gọi release trên đó (giả sử bạn đã giữ lại tham chiếu bạn đang giữ) và sau đó không tham chiếu. Bằng cách đó khi bạn thoát khỏi khung nhìn, cố gắng làm mất hiệu lực bộ đếm thời gian lần thứ hai sẽ chỉ gọi phương thức đó trên nil thay vào đó, điều đó không làm gì cả.

Hoặc, bạn có thể sử dụng -[NSTimer isValid] để kiểm tra xem nó có hợp lệ trước khi vô hiệu, nhưng thực sự không có lý do gì để giữ tham chiếu của bạn sau khi vô hiệu hóa nó lần đầu tiên. Ngoài ra, nếu vấn đề thực sự của bạn là bạn không giữ lại tham chiếu của bạn và vì vậy, -invalidate thực sự để lại cho bạn một điểm tham chiếu tại một đối tượng đã được giải phóng, sau đó gọi -isValid sẽ không giúp bạn.

+0

Cám ơn câu trả lời của bạn! –

+0

Đó là một lời giải thích rõ ràng. Cảm ơn! –

+0

Đó chính là giải pháp cho bài viết 'tin nhắn của tôi được gửi đến deallocated instance'. Cảm ơn. – High6

6

Điều tôi thường làm là hủy bỏ biến thành viên đang giữ bộ hẹn giờ, khi nó kích hoạt hoặc khi tôi vô hiệu hóa nó. Sau đó, bạn chỉ có thể làm:

[myNSTimer invalidate]; 
myNSTimer = nil; 

và nó sẽ làm điều đúng.

3

Tôi đã gặp sự cố tương tự trong khi tôi đang cố gắng tạm dừng & khởi động lại bộ hẹn giờ. Để ngăn chặn nó:

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

Và để bắt đầu/khởi động lại nó:

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

Bây giờ nó không sụp đổ khi tôi vô hiệu hóa nó.

1

Swift:

if timer.valid { 
    timer.invalidate() 
} 
Các vấn đề liên quan