UIScrollView 内存分配上的动画内容

Posted

技术标签:

【中文标题】UIScrollView 内存分配上的动画内容【英文标题】:Animation content on UIScrollView memory allocation 【发布时间】:2013-02-24 22:16:13 【问题描述】:

我在滚动视图中的内容上制作了动画,但我遇到了内存问题。所以我有 UITabBarController,在 3 个选项卡中我有一个自定义 UIView,它有一个 UIScrollView。我用它来动画水平内容滚动:

- (void)beginAnimation

if (isAnimating) 
    return;


[scrollView setContentOffset:[self startOffset]];

isAnimating = YES;

NSTimeInterval animationDuration = (scrollView.contentSize.width / self.tickerSpeed);

[UIView animateWithDuration:animationDuration
                      delay:0
                    options:UIViewAnimationOptionCurveLinear
                 animations:^
                     CGPoint finalPoint = CGPointZero;

                     if (self.scrollingDirection == BBScrollingDirectionFromRightToLeft) 
                         finalPoint = CGPointMake(scrollView.contentSize.width, 0);
                      else if (self.scrollingDirection == BBScrollingDirectionFromLeftToRight) 
                         finalPoint = CGPointMake(-scrollView.contentSize.width + self.frame.size.width, 0);
                     

                     scrollView.contentOffset = finalPoint;
                  completion:^(BOOL finished) 
                         isAnimating = NO;

                         [self beginAnimation];
                 ];

当我启动应用程序并位于第一个选项卡上时,一切正常,但当我切换到另一个选项卡时,仪器分配中的总字节数开始快速增长,实时字节数几乎相同。 谁能解释一下这是怎么回事?

【问题讨论】:

【参考方案1】:

我认为你正在创建一个无限循环

completion:^(BOOL finished) 
                         isAnimating = NO;

                         [self beginAnimation];
                 ];

为什么要通过完成块递归调用开始动画?这将是我对您的内存问题的猜测,块像其他 obj-c 对象一样保存到内存中并且它们占用空间。

编辑:

我建议您像这样修改对 smt 的动画调用,并再次检查您是否有内存问题:

[UIView animateWithDuration:animationDuration
                      delay:0
                    //I added autoreverse option also bc it seems like a good fit for your purpose
                    options:UIViewAnimationOptionCurveLinear | UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse
                 animations:^
                     [UIView setAnimationRepeatCount:10.0]; //This a class method, set repeat count to a high value, use predefined constants (ie HUGE_VALF) if it works for you 
                     ...
                 
];

【讨论】:

那么我应该怎么做才能一直为我的内容制作动画,比如在一些股票视图中? 但是如果我切换到其他选项卡它不起作用,那么动画也会停止,如果我回到第一个选项卡它就不再动画了。 所以你的回答现在帮助我解决了这个问题。我使用 UIViewAnimationOptionRepeat 重复动画并删除 [self beginAnimation];从完成块(它使内存增长)开始动画从 viewDidLoad 移动到 viewWillAppear 方法。谢谢。

以上是关于UIScrollView 内存分配上的动画内容的主要内容,如果未能解决你的问题,请参考以下文章

内存分配崩溃

iOS - 内容视图非常大的 UIScrollView,如何减少内存使用量?

为什么我们不能在堆栈上分配动态内存?

为外部 dll 上的缓冲区分配内存并在主应用程序上使用它是不是安全?

共享内存实现上的 C++ 内存池:这种分配和释放方法是不是正确?

WSL2 上的设备内存分配失败