【问题标题】:Recived memory warning and crash when loading many .jpg files with ARC使用 ARC 加载许多 .jpg 文件时收到内存警告和崩溃
【发布时间】:2012-04-26 10:28:49
【问题描述】:

我的记忆有问题。我使用 ARC。我正在将 .jpgs 加载到我的视图上的 UIImageView。

Code showing example situation:

//.h file

@interface myClass : UIViewController
{
    IBOutlet UIImageView * back;
}
// don' t have @property
// back is connected in .xib

//.m file
-(void) viewDidLoad {
    UIImage *  myImg =[UIImage imageNamed:imgName];

    back.image=myImg;
}

-(void) returnToPrevoriousView {
   [self removeFromSuperview];
   back.image = nil;
}

问题是我从另一个视图来到这个视图,而 imgName 可以有很多值。例如,我可以来 myClass 六次,然后我有日志:收到内存警告和我的应用程序崩溃。

我认为 myImg 没有从内存中释放?我不知道怎么解决? JPG 大约有 100kb。

PS。当我加载 .png 时,它可以工作(也更快),尽管 .png 图像通常有 600kB。但我认为它仍然不释放内存?

【问题讨论】:

  • 当您从viewDidLoad 中删除该代码时,是否还会发生这种情况?另外,你为什么要使用removeFromSuperview 而不是仅仅用dismissViewControllerAnimated:completion: 退出整个控制器?
  • 当我删除 back.image=myImg 然后应用程序工作(但我需要这个图像)。我通过调用 [ parent addSubview: myClass ] 添加 myClass。我可以用其他方式吗?我不需要 navigationController。
  • 如果这与视图控制器中的内部缓存有关,而不是与图像相关的任何内容,我不会感到惊讶。您没有正确退出视图控制器,请先尝试修复它。
  • 我将 addSubview 更改为:[self addChildViewController:myClass] 并在 out 按钮中添加:[self removeFromView] 和 [self removeFromParentViewController]]。现在工作。谢谢:)
  • 你为什么不直接使用pushModalViewControllerdismissViewController

标签: ios iphone ipad


【解决方案1】:

如果您确定该图像不会在您的应用中再次使用,请不要使用UIImage imageNamed:imageNamed: 使用内部缓存机制,将使用额外的内存。

来自UIImage Class Reference

此方法在系统缓存中查找具有 指定名称并返回该对象(如果存在)。如果一个匹配 图像对象尚未在缓存中,此方法加载图像 来自指定文件的数据,缓存它,然后返回 结果对象。

UIImage imageWithContentsOfFile: 用于单次使用的图像,因为这些图像不会被缓存。

注意:只有 imageNamed: 会自动加载 Retina 版本 (@2x)。

【讨论】:

    【解决方案2】:

    一般尝试使用 PNG 图像 .. 因为 iOS 已针对处理 PNG 图像进行了优化 .. JPEG 图像不提供这种优化,当 iOS 开始显示 jpg 时需要更复杂的解码过程,这将占用更多的 CPU 能量。

    【讨论】:

      【解决方案3】:

      将属性分配回 IBOutlet 并合成它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-07
        • 2012-12-28
        • 2015-08-08
        • 2014-04-19
        • 2011-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多