2012-07-03 40 views
1

我無法使NSTimer失效,他仍然繼續運行。無法使另一個類中的nstimer無效

一個我有:

-(void)startMachine 
{ 
    NSLog(@"START THE MACHINE "); 
    doesOn=1; 
     machineClock=[NSTimer scheduledTimerWithTimeInterval:0.05 
            target:self 
            selector:@selector(recordMachine:) 
            userInfo:nil 
            repeats:YES]; 
....//machineClock is on the .h file in interface 
} 

-(void)recordMachine:(NSTimer*)timer 
{ 

    NSLog(@"recordMachine"); 
... 

-(void)stopMachine 
{ 

     NSLog(@"STOP THE MACHINE !! "); 
     [machineClock invalidate]; 
     machineClock=nil; 
... 
} 

然後乙級,開始與停止:

classAinst=[recordMachine alloc]; 
    [classAinst startMachine]; //it starts here. 
    ...... 
    [classAinst stopMachine]; //it class the method to stop it,but the timer still ticks. 

什麼可能導致此? 我需要爲計時器創建一個屬性嗎? class a正在從b拿着計時器,所以它應該停止它沒有?

+0

你確定你只開始一次嗎? – Alexander

+0

是的,我確定,已經檢查過。 – user1280535

+0

@ user1280535只是爲了澄清,當你停止你的recordMachine時,「STOP THE MACHINE」被打印,但是「recordMachine」仍在打印,對不對? – janusbalatbat

回答

0

classB.h

@interface classB : ParentClass 
@property(nonatomic, strong)ClassA *Aclass; 
@end 

classB.m

@implementation classB 
@synthesize Aclass; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    Aclass =[[ClassA alloc]init]; 
    [Aclass startMachine]; 
    [Aclass stopMachine]; 
} 
@end 

你失去了ClassA的實例,這就是爲什麼你也失去了對它的控制。嘗試上面的代碼。

+0

我得到了錯誤,例如:我Aclass不在界面中,然後我添加它,它給出有關「強」屬性的錯誤。 – user1280535

+0

我在示例代碼中的命名僅用於示例目的。使用你的班級名稱 – janusbalatbat

+0

來吧我知道..我做了:) – user1280535

0

從啓動它的不同線程停止定時器會導致此問題。

如果你不使用多線程,你很可能會停止錯誤的計時器或錯誤的對象的計時器。你可以調試這一點,如果每次啓動一個定時器,你會打印開始它的它和目標地址:停車時

NSLog(@"starting %@ owned by %@", timer, self); 

而且是相同的:

NSLog(@"stopping %@ owned by %@", timer, self); 

然後確保號碼相匹配。 (並且ProcessName[11337:707]中的數字必須與NSLog輸出的一部分相匹配:第二個是線程ID,如果不同,它意味着您停止從其他線程定時器)。

+0

我得到了一些東西!我可以看到,在classB的開始階段,主類,我加載緩存許多圖像,然後我看到,如果我不加載它們 - 它以某種方式停止計時器!這意味着調用計時器的類b,需要大量內存並丟失了B的實例。 – user1280535