Dan*_*ies 5 memory objective-c uiimage ipad ios
我已经创建了一个应用程序,它已经准备好了(好吧).
该应用程序基本上是一个儿童闪存卡应用程序,每页有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"];
Run Code Online (Sandbox Code Playgroud)
然后在按下的按钮中,我通过调用将图像分配给图像视图:
domestic01ImageContainer.image = domestic100;
Run Code Online (Sandbox Code Playgroud)
在if else中查看图像编号是否为1到4.
无论如何它完美地工作(除了这个记忆问题)
我在网上看过,我最好宣布使用uiimages
[UIImage imageWithContentsOfFile:path]
Run Code Online (Sandbox Code Playgroud)
如本文所示: UIImage内存不能解除分配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"]];
Run Code Online (Sandbox Code Playgroud)
然后在按下的按钮中使用调用图像到imageview
[domestic01ImageContainer setImage:domestic100];
Run Code Online (Sandbox Code Playgroud)
我得到了相同的结果 - 图像只是在同一个内存中构建而不是释放或解除分配.
当它来自objective-c时,我不是wiz,这是我的第一个真正的应用程序.
如果有人能够善待他们的时间来帮助我,我会非常感激.
提前致谢.
******编辑******
所以我告诉你我如何在上面加载我的图像,我也在viewDidLoad中给出了12个图像视图的起点和隐藏的alpha.
domestic01ImageContainer = [[UIImageView alloc] initWithFrame:CGRectMake(30, 123, 152, 224)];
domestic01ImageContainer.Alpha = 0;
Run Code Online (Sandbox Code Playgroud)
然后我添加子视图:
[self.view addSubview:domestic01ImageContainer];
Run Code Online (Sandbox Code Playgroud)
为每个图像视图分配一个轻击手势,以便稍后隐藏图像:
UITapGestureRecognizer *domestic01Tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTaped:)];
[domestic01ImageContainer addGestureRecognizer:domestic01Tap];
[domestic01ImageContainer setUserInteractionEnabled:YES];
Run Code Online (Sandbox Code Playgroud)
当按下拇指/卡时,该按钮的流线型版本将是:
- (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) {
}];
Run Code Online (Sandbox Code Playgroud)
}
在我的imageTapped识别器中将全尺寸图像缩小回我使用的卡片:
[UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
domestic01ImageContainer.frame = CGRectMake(30, 123, 152, 224);
} completion:^(BOOL finished) {
domestic01ImageContainer.Alpha = 0;
}];
Run Code Online (Sandbox Code Playgroud)
这基本上将闪存卡从全屏幕恢复到卡/缩略图的大小,并再次将alpha设置为0.
就像我说的一切都有效,但正如你所说的那样,图像被保留在某个地方.
希望这能够更好地说明可能导致问题的原因.
我曾尝试在imageTapped中将alpha设置为0后将图像设置为nil,但这并没有清除内存.
[domestic05ImageContainer setImage:nil];
Run Code Online (Sandbox Code Playgroud)
好的,如果其他人正在遭受这个问题,那么这里是我发现完美工作的解决方案.
http://xcodenoobies.blogspot.co.uk/2011/02/best-way-to-use-uiimageview-memory.html
感谢安娜的投入,它直截了当地指出了我,但他的答案就是为我做的.
| 归档时间: |
|
| 查看次数: |
3371 次 |
| 最近记录: |