2008-12-15 16 views
12

मेरे पास NSTimer ऑब्जेक्ट है जो उपयोगकर्ता को किसी बटन पर टैप करने पर या यदि वे दृश्य से बाहर निकलते हैं तो मुझे अमान्य करने की आवश्यकता होती है।यह जांचने के लिए कि क्या NSTimer पहले से ही अमान्य कर दिया गया है

तो मेरे पास है:

[myNSTimer invalidate]; 

मेरी बटन हैंडलर के अंदर और viewWillDisappear अंदर। यदि उपयोगकर्ता किसी बटन पर टैप करता है और फिर एक दृश्य मौजूद होता है तो ऐप अपवाद फेंकता है क्योंकि myNSTimer पहले ही अमान्य कर दिया गया है। मुझे viewWillDisappear विधि में क्या करना है, यह जांचें कि myNSTimer को अमान्य कर दिया गया है या नहीं। मैं उसको कैसे करू?

मैं कोशिश की है:

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

लेकिन यह काम नहीं किया।

उत्तर

33

एक बार जब आप टाइमर को अमान्य कर देते हैं, तो बस उस पर release पर कॉल करें (मान लें कि आपने उस संदर्भ को बनाए रखा है जिसे आप पकड़ रहे हैं) और फिर अपना संदर्भ बताएं। इस तरह जब आप दृश्य से बाहर निकलते हैं, तो टाइमर को दूसरी बार अमान्य करने का प्रयास करने से बस उस विधि को शून्य पर कॉल किया जाएगा, जो कुछ भी नहीं करता है।

वैकल्पिक रूप से, आप -[NSTimer isValid] का उपयोग यह जांचने के लिए कर सकते हैं कि यह अमान्य होने से पहले वैध है या नहीं, लेकिन वास्तव में इसे पहली बार अमान्य करने के बाद आपके संदर्भ को पकड़ने का कोई कारण नहीं है। साथ ही, यदि आपकी वास्तविक समस्या यह है कि आपने अपना संदर्भ नहीं बरकरार रखा है और इसलिए पहले -invalidate वास्तव में आपको एक जारी ऑब्जेक्ट पर इंगित संदर्भ के साथ छोड़ देता है, तो -isValid पर कॉल करने से वैसे भी मदद नहीं मिलेगी।

+0

अपने जवाब के लिए धन्यवाद! –

+0

यह एक स्पष्ट स्पष्टीकरण है। धन्यवाद! –

+0

यह मेरे 'संदेश को आवंटित उदाहरण' समस्या के लिए भेजा गया समाधान का बिल्कुल समाधान था। धन्यवाद। – High6

6

मैं आमतौर पर जो करता हूं वह सदस्य चर को टाइमर धारण करता है, या तो जब यह आग लगती है, या जब मैं इसे अमान्य करता हूं। फिर आप बस कर सकते हैं:

[myNSTimer invalidate]; 
myNSTimer = nil; 

और यह सही काम करेगा।

3

मुझे एक ही समस्या है जबकि मैं & को रोकने की कोशिश कर रहा था टाइमर को पुनरारंभ करें। इसे रोकने के लिए:

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

और शुरू करने के लिए/उसे पुन: प्रारंभ:

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

अब यह दुर्घटना नहीं होती है जब मैं इसे अमान्य हो जाएगा।