一种方法永远称呼另一种方法,这会导致任何问题吗?

时间:2013-02-20 03:55:16

标签: ios uiview uiimage uiviewanimation

我写了一个小客户调查应用程序,在顶部我有一个汽车和一辆面包车的图像,我假装正在缩放。但是我编码的方式把它变成了一个无限循环,其中一个方法调用另一个方法,反之亦然。这就是动画永远播放。

这是我的代码

-(void)doAnimate {

    // animate van
    [UIView animateWithDuration:1.0
                          delay:7.f
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{

                         vanView.frame = CGRectMake(770, 175, vanView.frame.size.width, vanView.frame.size.height);

                     } completion:^(BOOL finished) {
                         if (finished) {
                             [self doAnimateLoop];
                         }
                     }];

    // animate car
    [UIView animateWithDuration:1.0
                          delay:3.f
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{

                         carView.frame = CGRectMake(-600, 250, carView.frame.size.width, carView.frame.size.height);

                     } completion:^(BOOL finished) {
                         if (finished) {

                         }
                     }];
}

-(void)doAnimateLoop {


    vanView.frame = CGRectMake(-600, 175, vanView.frame.size.width, vanView.frame.size.height);
    carView.frame = CGRectMake(770, 250, carView.frame.size.width, carView.frame.size.height);


    // second animation van
    // animate van
    [UIView animateWithDuration:1.0
                          delay:2.f
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{

                         vanView.frame = CGRectMake(111, 175, vanView.frame.size.width, vanView.frame.size.height);

                     } completion:^(BOOL finished) {
                         if (finished) {

                         }
                     }];

    // animate car
    [UIView animateWithDuration:1.0
                          delay:5.f
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{

                         carView.frame = CGRectMake(104, 250, carView.frame.size.width, carView.frame.size.height);

                     } completion:^(BOOL finished) {
                         if (finished) {
                             [self doAnimate];
                         }
                     }];

}

我想知道这是否会导致该应用程序出现任何问题?比如内存泄漏或可能导致其崩溃的东西。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果你小心,无限循环不一定是坏的。

您需要确保在不需要动画时停止动画,因为它会占用宝贵的CPU时间。这可能会使应用程序响应缓慢,因为它在不需要时花费CPU时间动画。

当视图不再附加到活动窗口时,您可以停止动画(请参阅下面的代码),这是离开视图控制器时的情况。

/**
 * doAnimate
 * Animates view with a call back to its self for infinite animation, stops on view unload.
 */
-(void)doAnimate
{
    //view is active, animate. else stop
    //this will stop the animation when the view is unloaded
    if (self.view.window)
    {
        //Animate your views
    }
}

如果您有良好的编码标准和实践内存泄漏,则内存泄漏很少。如果您担心或怀疑内存泄漏,那么您可以使用通常的工具(即Instruments)来检查内存使用情况。

根据您的代码,它看起来很适合基本实现。 祝你好运。

答案 1 :(得分:-2)

如果它在一个单独的线程中运行,那么进入无限循环不是问题。问题是你可以处理内存吗?因为循环是无限的,即使最微小的泄漏也会导致崩溃。我建议你使用一些有效的api,如果你怀疑你的手脏了就把它留在手中