2009-09-15 19 views
47

संभव डुप्लिकेट:
NSTimer doesn't stopNStimer ईवेंट को कैसे रोकें?

अपने आवेदन में मैं NSTimer का उपयोग कर रहा एक एनीमेशन समारोह हर 3 सेकंड कॉल करने के लिए। मैं इस टाइमर को रोकना चाहता हूं और टाइमर अभी भी चल रहा है, जबकि एक और घटना कहा जाता है। क्या यह संभव है?

उत्तर

42

सबसे पहले, आप टाइमर

self.packetTimer = [NSTimer timerWithTimeInterval:CONNECTION_TIMEOUT target:self selector:@selector(connectionTimeout:) userInfo:nil repeats:NO]; 
[[NSRunLoop currentRunLoop] addTimer:packetTimer forMode:NSDefaultRunLoopMode]; 

तो कहीं और अपने कोड में आप इसे रद्द करना चाहते करने के लिए एक सूचक रखना चाहते हैं, बस फोन:

[self.packetTimer invalidate]; 
self.packetTimer = nil; 
+1

चाहिए नहीं आप इसे शून्य करने से पहले टाइमर जारी करें? 'अमान्य' रन लूप को इसके संदर्भ को रिलीज़ करने का कारण बनता है लेकिन इसे 'पैकेट टाइमर' के लिए असाइन किए जाने पर अतिरिक्त अतिरिक्त रहता है। –

+1

यह सच है। – coneybeare

+0

हम्म ठीक किया गया। यह मुझे सही नहीं लग रहा है। सेबैटियन सही है - जब आप टाइमर को self.packetTimer को सौंपते हैं (माना जाता है कि यह एक बरकरार संपत्ति है) तो एक बरकरार है। इसे रनलोप में जोड़ना एक दूसरा बरकरार है। जब आप इसे बाद में अमान्य करते हैं, तो आंतरिक रूप से एक रिलीज़ होती है। मुझे लगता है कि आपको अमान्य होने के ठीक बाद और self.packetTimer को शून्य से पहले सेट करने से पहले एक स्पष्ट [self.packetTimer रिलीज} की आवश्यकता है। क्या मै गलत हु? – Marc

101
@interface 
    NSTimer *autoTimer; 

@implementation 

// Start timer 
    autoTimer = [NSTimer scheduledTimerWithTimeInterval:(3.0) 
     target:self 
     selector:@selector(autoTimerFired:) 
     userInfo:nil 
     repeats:YES]; 

// Stop timer: 
    [autoTimer invalidate]; 
    autoTimer = nil; 
+20

स्विफ्ट में, निश्चित रूप से, 'autoTimer.invalidate() ', और' शून्य 'पर सेट करने की कोई आवश्यकता नहीं है। – Joe

+0

स्विफ्ट में, यदि आप इसे शून्य पर सेट करते हैं, तो टाइमर अभी भी आग लग सकता है। यह मेरे साथ हुआ। – kkazakov

+0

इससे पहले कि आपको 'INVALIDATE' IT @kkazakov चाहिए! –

संबंधित मुद्दे