Ios NSTimer未能停止?

Ios NSTimer未能停止?,ios,objective-c,nstimer,Ios,Objective C,Nstimer,抱歉,这是一个重复的问题,但我已经尝试了所有我能找到的解决方案,但没有成功 不管怎么说,这是我的问题,特别是。我有以下代码,在长按手势时启动计时器,然后在取消该手势或动作完成时停止 -(void)photoLongPress:(UILongPressGestureRecognizer *)press { NSTimer *timer = nil; if (press.state == UIGestureRecognizerStateBegan) { //

抱歉,这是一个重复的问题,但我已经尝试了所有我能找到的解决方案,但没有成功

不管怎么说,这是我的问题,特别是。我有以下代码,在长按手势时启动计时器,然后在取消该手势或动作完成时停止

-(void)photoLongPress:(UILongPressGestureRecognizer *)press
{
    NSTimer *timer = nil;

    if (press.state == UIGestureRecognizerStateBegan)
    {
        //Start timer
        timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(photoLongPressTimer:) userInfo:nil repeats:YES];
    }
    if (press.state == UIGestureRecognizerStateEnded)
    {
        [timer invalidate];
        timer = nil;
    }
}

-(void)photoLongPressTimer:(NSTimer *)timer
{
    DAProgressOverlayView *progress = (DAProgressOverlayView *)[self.view viewWithTag:kTagPhotoDeleteProgressIndicator];

    progress.progress += 0.08;

    if (progress.progress == 1)
    {
        [self deletePhotoSelection];
        [timer invalidate];
        timer = nil;
    }
}
当在photoLongPress timer方法中无效时,计时器停止,但如果在photoLongPress方法中手势停止,则不会停止。为什么会这样?我被难住了

谢谢。

您需要将计时器存储在实例变量中,以便以后可以引用它。它在photoLongPressTimer中工作:因为计时器是作为参数传递的,但在photoLongPress中,它是nil,因为您不仅创建了它,而且它是一个本地引用

添加属性:

@property (strong, nonatomic) NSTimer *timer;
[self.timer invalidate];
self.timer = nil;
将新计时器存储到其中:

self.timer = [NSTimer schedu...
使该财产无效:

@property (strong, nonatomic) NSTimer *timer;
[self.timer invalidate];
self.timer = nil;
问题在于NSTimer*定时器=nil; in-void Photo LongPress:UILongPress手势识别器*按 方法

移除NSTimer*定时器=零;从这个方法和存储实例的NSTimer

NSTimer *timer = nil;
此行仅创建一个局部变量。 您必须为计时器创建一个属性。 把这个放在你的.h文件中

然后在这里使用代码

-(void)photoLongPress:(UILongPressGestureRecognizer *)press
{    
    if (press.state == UIGestureRecognizerStateBegan)
    {
        //Start timer
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(photoLongPressTimer:) userInfo:nil repeats:YES];
    }
    if (press.state == UIGestureRecognizerStateEnded)
    {
        [self.timer invalidate];
        self.timer = nil;
    }
}

-(void)photoLongPressTimer:(NSTimer *)timer
{
    DAProgressOverlayView *progress = (DAProgressOverlayView *)[self.view viewWithTag:kTagPhotoDeleteProgressIndicator];

    progress.progress += 0.08;

    if (progress.progress == 1)
    {
        [self deletePhotoSelection];
        [timer invalidate];
        timer = nil;
    }
}

这很有效。但我很好奇,为什么局部变量在第一次出现时似乎是对原始对象的引用时不起作用?在最初创建计时器时,您有该引用,但每次手势更改时,会再次调用该方法,并创建一个新的局部引用并将其设置为零。这将有助于详细说明存储方式从技术上讲,海报正在存储一个实例,尽管是暂时的。