我无法使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持有计时器,所以应该阻止它吗?
答案 0 :(得分: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的实例,这就是为什么你也失去了它的控制权。试试上面的代码。
答案 1 :(得分:0)
从启动它的不同线程停止计时器将导致此问题。
如果您没有使用多个线程,那么您最有可能停止错误的计时器或错误对象的计时器。你可以调试这个,如果每次启动一个计时器,你打印它的地址和启动它的对象:
NSLog(@"starting %@ owned by %@", timer, self);
停止时也一样:
NSLog(@"stopping %@ owned by %@", timer, self);
然后确保数字匹配。 (并且NSLog输出的ProcessName[11337:707]
部分中的数字也必须匹配:第二个是线程ID,如果它不同,则表示你从其他线程停止计时器。)