1

我不能使 NSTimer 无效,他会继续运行。

A 类我有:

-(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 的计时器,所以它应该停止它吗?

4

2 回答 2

0

B类.h

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

B类.m

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

你失去了 classA 的实例,这就是为什么你也失去了对它的控制。试试上面的代码。

于 2012-07-03T08:32:02.973 回答
0

从启动它的不同线程停止计时器将导致此问题。

如果您没有使用多个线程,那么您很可能正在停止错误的计时器或错误对象的计时器。如果每当启动计时器时,您可以调试它,您会打印它的地址和启动它的对象:

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

停止时也一样:

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

然后确保数字匹配。(并且ProcessName[11337:707]NSLog 输出中的部分数字也必须匹配:第二个是线程 ID,如果它不同,则意味着您确实从其他线程停止了计时器)。

于 2012-07-03T08:33:47.280 回答