NSTimers和NSRunLoops的不稳定行为

时间:2012-06-20 23:30:45

标签: iphone objective-c ios

我正在尝试使用UIImageView从右到左制作CGAffineTransformMakeTranslation()(手指图片)动画。此动画将重复,直到用户执行滑动,在教程中移动用户。所有这些已经在游泳中如下工作:

[UIView animateWithDuration:1.0 animations:^ {
    self.finger.alpha = 1.0; 
}completion:^(BOOL finished) {
    CGAffineTransform originalTransform = self.finger.transform;
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^ {

        self.finger.transform = CGAffineTransformMakeTranslation(-200, 0);
        self.finger.alpha = 0.0;

        }completion:^(BOOL finished) {

            self.finger.transform = originalTransform;
            NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(repeatSwipeAnimation1) userInfo:nil repeats:YES];
            self.swipeTimerForFinger1 = timer;
            NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
            [runLoop addTimer:self.swipeTimerForFinger1 forMode:NSDefaultRunLoopMode];
            [self.swipeTimerForFinger1 fire];


            }];

        }];

选择器:

-(void)repeatSwipeAnimation1 {
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseIn animations:^ {
    self.finger.alpha = 1.0;
}completion:^(BOOL finished) {
    CGAffineTransform originalTransform = self.finger.transform;
    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^ {
        self.finger.transform = CGAffineTransformMakeTranslation(-200, 0);
        self.finger.alpha = 0.0;
    }completion:^(BOOL finished) {
        self.finger.transform = originalTransform;

    }];
}];
}

手指动画和翻译精美。

当我想用不同的手指和不同的计时器进行此操作时,会出现此问题。我有相同的完全代码,但它是一个不同的手指和不同的计时器选择器。

当我调用方法无效时,定时器的选择器将转换UIImageView,并且(更可怕)定时器不会失效。在调试时,我看到第二个计时器正在调用第二个选择器,但只是没有表现(例如,没有翻译,并且在第二个手指中过快地淡出)。

我假设我第一次打电话时需要以某种方式关闭NSRunLoop?这是第一次使用NSRunLoop,所以我为我的无知道歉。任何帮助都非常适合。

1 个答案:

答案 0 :(得分:1)

嗯,你肯定有一个阻止保留周期。您需要使用__block或__weak说明符。见Blocks and Variables。您的问题可能与内存问题有关。

确保在完成后使第一个计时器无效。

为安全起见,您可能还想在尝试转换之前重置UIImageView上的转换。你可以这样做:

finger.transform = CGAffineTransformIdentity;