记忆警告&崩溃ImageIO-jpeg-data

时间:2014-12-12 21:47:43

标签: ios objective-c ipad memory uiimage

我已经创建了一个应用程序,它已经准备好提交了。

该应用程序基本上是一个儿童闪存卡应用程序,每页有12张卡。

目前仅限iPad,当触摸卡片时,图像视图会以全分辨率2048 x 1536从卡片中全屏显示,并播放动物的声音,您可以点按全尺寸图像回到卡片里。每张卡都分配了5张图像。该应用程序在设计期间一直运行良好,现在我已经加载了所有动物,我一直在测试它,发现它崩溃了。

长话短说,内存每张图像不断增长12MB(尽管每幅图像大约为200-400KB),直到达到700MB的内存并崩溃。这种记忆永远不会减少。

我已经通过xcode工具运行应用程序并且可以看到没有泄漏,但已在“分配”中识别出来。它是' ImageIO-jpeg-data'作为罪魁祸首的类别。

我整晚都在读这篇文章,因为我发现了一些有希望的结果,但是这些结果对我没有用,所以我假设我误解了所建议的内容,或者我没有理解,所以希望有人可以也许可以帮助我解释或以外行的方式解释我如何解决这个问题。

好的,以便解释我如何设置视图控制器。

最初我为阵列中的每张卡设置了5张图片,但是有一段延迟,所以有人在这里建议我在viewDidLoad中预先加载图像,然后在触摸卡片/按钮时调用它们。

例如,我在viewDidLoad

中使用了这种格式
domestic100 = [UIImage imageNamed:@"ferret-00"];
domestic101 = [UIImage imageNamed:@"ferret-01"];
domestic102 = [UIImage imageNamed:@"ferret-02"];
domestic103 = [UIImage imageNamed:@"ferret-03"];
domestic104 = [UIImage imageNamed:@"ferret-04"];

然后在按下的按钮中,我通过调用

将图像分配给图像视图
domestic01ImageContainer.image = domestic100; 

在if else中查看图片编号是否为1到4。

无论如何,它完美地工作(除了这个记忆问题)

我在网上看到我最好使用

声明uiimages
[UIImage imageWithContentsOfFile:path]

如本文所示: UIImage memory not deallocating VM: ImageIO_JPEG_DATA?

因此,我在代码中所做的更改是:

在我的viewDidLoad中我现在创建uiimages:

domestic200 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"dog-00" ofType: @"jpg"]];
domestic201 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"dog-01" ofType: @"jpg"]];
domestic202 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"dog-02" ofType: @"jpg"]];
domestic203 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"dog-03" ofType: @"jpg"]];
domestic204 = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"dog-04" ofType: @"jpg"]];

然后在按下的按钮中使用

将图像调用到imageview
[domestic01ImageContainer setImage:domestic100];

我得到了相同的结果 - 图像只是在同一个内存中构建而不是释放或解除分配。

我没有wiz,因为它是Objective-c,这是我的第一个真正的应用程序。

如果有人愿意花些时间来帮助我,我会非常感激。

提前致谢。

****** 修改 ******

所以我告诉你我如何在上面加载我的图像,我也在viewDidLoad中给出了12个图像视图的起点和隐藏的alpha。

domestic01ImageContainer = [[UIImageView alloc] initWithFrame:CGRectMake(30, 123, 152, 224)];
domestic01ImageContainer.Alpha = 0;

然后我将子视图添加到:

[self.view addSubview:domestic01ImageContainer];

为每个图像视图分配一个轻击手势,以便稍后隐藏图像:

UITapGestureRecognizer *domestic01Tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTaped:)];
[domestic01ImageContainer addGestureRecognizer:domestic01Tap];
[domestic01ImageContainer setUserInteractionEnabled:YES];

按下拇指/卡片时,按钮的流线型版本为:

- (IBAction)domestic01ButtonClicked:(id)sender {
static int imageNumber = 0;

if (imageNumber == 0) {
    [domestic01ImageContainer setImage:domestic100];
    imageNumber++;
}

else if (imageNumber == 1) {
    [domestic01ImageContainer setImage:domestic101];
    imageNumber++;
}

else if (imageNumber == 2) {
    [domestic01ImageContainer setImage:domestic102];
    imageNumber++;
}

else if (imageNumber == 3) {
    [domestic01ImageContainer setImage:domestic103];
    imageNumber++;

}

else if (imageNumber == 4) {
    [domestic01ImageContainer setImage:domestic104];
    imageNumber = 0;
}

domestic01ImageContainer.Alpha = 1;

[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        domestic01ImageContainer.frame = CGRectMake(0, 0, 768, 1024);
    } completion:^(BOOL finished) {

}];

}

在我的imageTapped识别器中将全尺寸图像缩小回我使用的卡片:

[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        domestic01ImageContainer.frame = CGRectMake(30, 123, 152, 224);
    } completion:^(BOOL finished) {
        domestic01ImageContainer.Alpha = 0;
    }];

这基本上将闪存卡从全屏幕恢复到卡片/缩略图的大小,并再次将alpha设置为0。

就像我说这一切都有效,但正如你所说的那样,图像被保留在某个地方。

希望这能够更好地说明可能导致问题的原因。

我曾尝试在imageTapped中将alpha设置为0后将图像设置为nil,但这并没有清除内存。

[domestic05ImageContainer setImage:nil];

2 个答案:

答案 0 :(得分:6)

好的,如果其他人遇到这个问题,那么这里是我发现完美工作的解决方案。

http://xcodenoobies.blogspot.co.uk/2011/02/best-way-to-use-uiimageview-memory.html

感谢安娜的投入,它直截了当地指出了我,但他的回答是为我做的。

答案 1 :(得分:1)

我遇到了类似的问题。记忆被异常举行。我有一个UIImageView IBOutlet,我用我的视图控制器的UIImage属性设置了它的图像属性,我将在初始化视图控制器时设置它。即使我回到根视图控制器,UIImageView也会错误地保留我的视图控制器的UIImage属性。

我通过将视图控制器的UIImage属性更改为NSData并设置UIImageView的图像属性来修复此问题,如下所示:

[_previewImageView setImage:[UIImage imageWithData:_previewImageData]];

这解决了ImageIO-jpeg数据不必要的帮助问题。希望这有助于某人。