我创建了一个背景随意变化的视图。共有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的内存使用量,当我推动其他视图时它仍然超过34 mb。尽管我已经使myTimer
变量nil
;
- (void)viewWillDisappear:(BOOL)animated
{
[myTimer invalidate];
self.imgView.image=nil;
myTimer = Nil;
}
我如何管理内存使用?
答案 0 :(得分:1)
您必须使计时器无效,将其设置为nil不会阻止它被触发:
一旦在运行循环上调度,计时器将以指定的时间间隔触发,直到它失效。非重复计时器在触发后立即使其自身无效。但是,对于重复计时器,您必须通过调用其invalidate方法自行使计时器对象无效。调用此方法请求从当前运行循环中删除计时器;因此,您应始终从安装计时器的同一线程中调用invalidate方法。使计时器失效会立即禁用它,以使其不再影响运行循环。 运行循环然后在invalidate方法返回之前或稍后的某个时刻删除计时器(以及它对计时器的强引用)。一旦失效,就不能重复使用计时器对象。
所以你需要
[myTimer invalidate];
myTimer = nil;
停止运行。
在内存使用方面;你期待发生什么?如果您刚刚在导航堆栈上推送了一个新视图,则旧视图仍然存在,其内容将在内存中。层缓存不会被删除,直到应用程序受到内存压力,34MB可能不会导致这种情况。
正如评论中指出的那样,imageNamed将图像缓存在内存中(同样,直到你受到内存压力),你还需要调用viewXXappear的超级实现来确保UIKit正确处理事情。
尝试模拟内存警告并查看发生的情况。我不认为你有什么值得担心的,现在你的计时器无效了。
答案 1 :(得分:0)
还尝试添加到viewdiddisappear,
self.imgView=nil;
答案 2 :(得分:0)
方法imageNamed:
缓存在内存压力情况下它只会驱逐它的图像,尝试使用imageWithContentsOfFile:
,当你想强制释放时,将图像视图的图像属性设置为nil。 / p>