如何在ios中有效地管理内存

时间:2014-07-23 07:21:32

标签: ios nstimer

我创建了一个背景随意变化的视图。共有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;

enter image description here

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

我如何管理内存使用?

3 个答案:

答案 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>