Iphone 停止NSTimer会导致错误

Iphone 停止NSTimer会导致错误,iphone,Iphone,我使用下面的代码来停止NSTimer -(void)stopTimer:(NSTimer*)timer; { if(!timer) return; if([timer isValid]) { [timer invalidate]; timer = nil; } } 有时会导致“EXC坏访问” 有时我会 -[__NSCFType isValid]: unrecognized selector sent to instan

我使用下面的代码来停止NSTimer

-(void)stopTimer:(NSTimer*)timer;
{
    if(!timer) return;
    if([timer isValid])
    {

        [timer invalidate];
        timer = nil;

    }



}
有时会导致“EXC坏访问”

有时我会

 -[__NSCFType isValid]: unrecognized selector sent to instance 0x6298eb0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType isValid]: unrecognized selector sent to instance 0x6298eb0'
我想我的代码已经检查了NSTimer是否有效,如果确定,则执行“invalidate”


欢迎发表评论

我怀疑您过度释放了计时器变量

删除
timer=nil;
行,看看会发生什么

invalidate
文档说明:

此方法是从nsrunlop中删除计时器的唯一方法 对象。NSRunLoop对象删除并释放计时器 在invalidate方法返回之前或稍后某个时间

如果配置了目标和用户信息对象,则接收器 同时释放对这些对象的引用


如果在其他任何地方使计时器无效,则会发生这种情况

确保在计时器被释放或失效的任何地方,指向计时器的指针都为零

您还可以添加第二次检查

if ([timer isKindOfClass:[NSTimer class]])

NSTimer
应该是
ivar
或属性。保留的属性最简单,因为保留/释放由@syntheticated accessor方法控制。由于类现在引用了NSTimer指针,因此不需要将计时器作为参数传递。这可以像这样实现。在中。h:

@property (strong, nonatomic) NSTimer *timer;
in.m:

@synthesize timer = _timer;
-(void)stopTimer{
    [self.timer invalidate];
    self.timer = nil;
}
-(void)startTimer{
    [self stopTimer];
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timerTarget) userInfo:nil repeats:YES];
}
您的方法导致崩溃的可能原因是您正在向它传递一个垃圾指针。指向错误类的有效对象的指针或指向已回收内存的解除分配对象的指针


请注意,指向解除分配对象的指针不会通过
(!timer)
检查,除非指针(在本例中为timer)已设置为nil。

如果在任何时候计时器自身失效(即不重复),它将被删除并从运行循环中释放。如果您自己不保留它,它将被解除分配。对解除分配的对象调用方法会导致崩溃

要解决此问题,可以使用弱引用

__weak NSTimer *timer;


这使得如果计时器在任何时候被释放,它也会被设置为零。

@monsabre:你在你的应用程序中使用了某种线程吗?你能告诉我你是如何调用stopTimer方法的吗?我按照你说的做了,同样的结果,我正要添加DanZimm刚刚发表的相同评论。看起来它并不总是一个计时器对象被传递到您的
stopTimer
方法。但是我注意到NSTimer并没有真正停止,我的意思是它看起来像[timer invalidate]没有真正停止NSTimer,我使用NSTimer来触发执行某些操作。我希望切换到另一个过程并重复执行相同的操作。因此,我希望停止NSTimer并启动另一个NSTimerim,但仍然不理解-如果您发布更多代码,也许我可以帮助您使用它作为检查,这确实是一个坏主意-它在某些情况下修复了症状s、 但这并不是根本的问题。发生的事情是,当计时器失效时,它正在被释放,另一个随机对象被分配到它的位置(内存回收)您正在尝试检查该对象是否是您的原始对象。但如果没有重新分配任何对象,该怎么办?此检查将抛出另一个EXC\u BAD\u访问。
@property (weak, nonatomic) NSTimer *timer;