gpt4 book ai didi

ios - ios如何有效管理内存

转载 作者:行者123 更新时间:2023-11-29 02:47:43 24 4
gpt4 key购买 nike

我创建了一个背景随机变化的 View 。总共有 10 张图片,我用它来显示。

下面是背景图片的代码。

- (void)viewWillAppear:(BOOL)animated
{
myTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changeImage) userInfo:nil repeats:YES];
}

-(void)changeImage
{
self.imgView.image=nil;
int randNum = rand() % (9 - 1) + 1;.
NSString *num = [NSString stringWithFormat:@"%d", randNum];
self.imgView.image=[UIImage imageNamed:[NSString stringWithFormat:@"%@.png",num]];
}

代码运行良好。

我的问题是;它显示超过 34mb 的内存使用情况,当我推送其他 View 时它仍然超过 34mb。尽管我已经将 myTimer 变量设置为 nil;

enter image description here

- (void)viewWillDisappear:(BOOL)animated
{
[myTimer invalidate];
self.imgView.image=nil;
myTimer = Nil;
}

我如何在这里管理内存使用?

最佳答案

你必须使你的计时器无效,将它设置为 nil 不会阻止它触发:

Once scheduled on a run loop, the timer fires at the specified interval until it is invalidated. A non-repeating timer invalidates itself immediately after it fires. However, for a repeating timer, you must invalidate the timer object yourself by calling its invalidate method. Calling this method requests the removal of the timer from the current run loop; as a result, you should always call the invalidate method from the same thread on which the timer was installed. Invalidating the timer immediately disables it so that it no longer affects the run loop. The run loop then removes the timer (and the strong reference it had to the timer), either just before the invalidate method returns or at some later point. Once invalidated, timer objects cannot be reused.

所以你需要

[myTimer invalidate];
myTimer = nil;

停止运行。

在内存使用方面;你期待发生什么?如果您刚刚在导航堆栈上推送了一个新 View ,旧 View 仍然存在并且其内容将在内存中。在应用程序遇到内存压力之前,图层缓存不会被删除,34MB 可能不会导致这种情况。

正如评论中指出的那样,imageNamed 将图像缓存在内存中(同样,直到您遇到内存压力)并且您还需要调用 viewXXappear 的 super 实现以确保 UIKit 正确处理事情。

尝试模拟内存警告,看看会发生什么。我不认为你有什么可担心的,现在你正在使计时器无效。

关于ios - ios如何有效管理内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24904163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com