2011-09-07 9 views
5

में एनएसटीमर का अनदेखा कैसे करें मैं एप्लिकेशन में नेस्टेड एनएसटीमर का उपयोग कर रहा हूं। मेरे यहां दो मुद्दे हैं।उद्देश्य-सी

  1. कैसे इस समारोह - (void)updateLeftTime:(NSTimer *)theTimer
  2. कैसे क्योंकि - (void)updateLevel:(NSTimer *)theTimer भी टाइमर द्वारा बुला रहा है पिछले टाइमर को मारने के लिए में समय काउंटर पुनः आरंभ करने के।

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    tmLevel=[NSTimer scheduledTimerWithTimeInterval:20.0f target:self selector:@selector(updateLevel:) userInfo:nil repeats:YES]; 

    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
} 

- (void)updateLevel:(NSTimer *)theTimer { 
    static int count = 1; 
    count += 1; 

    lblLevel.text = [NSString stringWithFormat:@"%d", count]; 

    tfLeftTime.text=[NSString stringWithFormat:@"%d",ANSWER_TIME]; 

    tmLeftTime=[[NSTimer alloc] init]; 
    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
    [self playMusic]; 

} 
- (void)updateLeftTime:(NSTimer *)theTimer { 
    static int timeCounter=1; 
    timeCounter+=1; 
    tfLeftTime.text=[NSString stringWithFormat:@"%d", (ANSWER_TIME-timeCounter)]; 
} 
+1

उपयोग अमान्य विधि कर रहे थे – Narayana

उत्तर

17
  • उपयोग [tmLevel invalidate] एक टाइमर की अनुसूची रद्द करने के लिए।
  • मत भूलना tmLevel=nil स्थापित करने के लिए तुरंत बाद
  • मत भूलना यह करने के लिए संदर्भ खो से पहले tmLevel टाइमर रद्द करने के लिए (के बाद टाइमर अनिर्धारित किया गया है और Runloop द्वारा जारी किया है चर का उपयोग कर से बचने के लिए), अर्थात् [tmLevel invalidate] फोन भी tmLevel चर के लिए एक नया NSTimer सौंपने से पहले (या किसी पिछले टाइमर नया एक के अलावा चलना जारी रहेगा)

यह भी ध्यान रखें अपने कोड में आप बेकार आवंटन कि इसके अलावा एक पैदा कर रहे है रिसाव:

tmLeftTime=[[NSTimer alloc] init]; 
tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 

यहां आप एक एनएसटीमर उदाहरण आवंटित करते हैं, इस उदाहरण को tmLeftTime में संग्रहीत करें ... और फिर [NSTimer scheduledTimerWithTimeInterval:...] का उपयोग करके इसे किसी अन्य के साथ बदलने के लिए तत्काल इस उदाहरण के बारे में भूल जाओ! इसलिए, [[NSTimer alloc] init] का उपयोग करके बनाया गया एनएसटीमर खो गया है, और एक रिसाव बना रहा है (क्योंकि इसे कभी जारी नहीं किया जाएगा)।

में आप सबसे पहले पूरी तरह से बेकार है, यह की तरह थोड़े आप

int x = 5; 
x = 12; // of course the value "5" is lost, replaced by the new value 
11

निम्न पंक्तियां जोड़ें जब यू टाइमर रीसेट करने के लिए

[tmLeftTime invalidate]; 
tmLeftTime = nil; 

चाहते आप भी

if ([tmLeftTime isValid]){ 
    // the timer is valid and running, how about invalidating it 
    [tmLeftTime invalidate]; 
    tmLeftTime = nil; 
} 
0

उपयोग कर सकते हैं कैसे के बारे में के बजाय 3 केवल एक टाइमर का उपयोग ?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    tmLeftTime=[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
} 

- (void)updateLevel { 
    static int count = 1; 
    count += 1; 

    lblLevel.text = [NSString stringWithFormat:@"%d", count]; 

    tfLeftTime.text=[NSString stringWithFormat:@"%d",ANSWER_TIME]; 

    [self playMusic]; 

} 
- (void)updateLeftTime:(NSTimer *)theTimer { 
    static int timeCounter=1; 
    timeCounter+=1; 
    tfLeftTime.text=[NSString stringWithFormat:@"%d", (ANSWER_TIME-timeCounter)]; 
    if (timeCounter >= ANSWER_TIME) { 
     timeCounter = 0; 
     [self updateLevel]; 
    } 
} 
0

अपने updateLevel में अमान्य विधि के साथ अपने टाइमर अमान्य: विधि और फिर से अनुसूची एक ही घड़ी।

[tmLevel invalidate]; 
tmLevel = [NSTimer scheduledTimerWithTimeInterval:20.0f target:self selector:@selector(updateLevel:) userInfo:nil repeats:YES]; 

और तुम updateTimeLeft फोन करना चाहते हैं, तो: विधि आप एक और टाइमर alloc की जरूरत नहीं है, यह एक बड़ी रिसाव है, क्योंकि आप कभी नहीं उन संदर्भों को जारी कर रहे हैं।

tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 

और अपने updateTimeLeft में: बस घड़ी की विधि को फिर से शेड्यूल करने और एक शर्त है जहाँ यह बंद कर देना चाहिए निर्धारित किया है।

tmLeftTime = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateLeftTime:) userInfo:nil repeats:YES]; 
+0

ओह है! मैं समझ गया, लेकिन वास्तव में मैं अभी भी मिड में हूं इसलिए कोड उचित नहीं है, मुझे स्तर के पूरा होने के बाद इसे फिर से शुरू करना होगा और एक स्तर के 20 प्रश्न होंगे। एक स्तर के पूरा होने के बाद मुझे एक विज्ञापन दिखाना है।इसलिए इस तरह मुझे इसे पुनरारंभ करना होगा। आपको बहुत बहुत धन्यवाद –