2012-07-03 4 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; 
... 
} 

클래스 B, 시작과 중지에 :

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

어떤이의 원인? 타이머에 대한 속성을 만들어야합니까? 클래스 a가 b에서 타이머를 보유하고 있으므로 no를 중지해야합니까? 당신은 또한 그것의 통제를 잃은 이유

+0

한번만 시작 하시겠습니까? – Alexander

+0

예, 확신합니다. – user1280535

+0

@ user1280535 레코드를 중지 할 때 명확하게하기 위해 "기계 중지"가 인쇄되지만 "레코드 머신"은 여전히 ​​인쇄 중입니까? – 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

뭔가가 있습니다! 클래스 B의 시작 부분에서 메인 클래스에서 캐시에 많은 이미지가로드 된 것을 볼 수 있습니다. 그런 다음로드하지 않으면 어떻게 든 타이머를 중지합니다. 즉, 타이머를 호출하고, 많은 메모리를 사용하며, B의 인스턴스를 잃은 클래스 b를 의미합니다. – user1280535

관련 문제