我的应用程序以处理动作激活的图像为中心。大多数应用程序将包含以下各种各样的变体,如下所示。
-(IBAction)tap{
if(a == 0){
a = 1;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:(1.8)];
[image setAlpha:1];
}else if (a== 1){
a = 0;
[image setAlpha:0];
}
[UIView commitAnimations;
}
问题是由于我收到多个内存警告,我无法在iPad上运行此功能。面向活动的工具明确指出,当我的应用程序被访问时,“backboardd”使用287兆字节。一旦访问了最重的所有视图控制器,我的应用程序就会崩溃。我的问题是我将如何释放这些图像,直到绝对需要这些图像。请记住,使用面向ARC的方法时,严格禁止使用许多方法。我感谢任何通过回复这篇文章来帮助我的尝试。
更新:如果你看下面,那么你会看到能够加载图像的片段。
-(IBAction)thisisanaction{
UIImage *letter = [UIImage imageNamed:@"HelloWorld.png"];
[imageholder setImage:letter];
额外信息:
# Address Category Timestamp Live Size Responsible Library Responsible Caller
2 0x4c4e000 VM: ImageIO_PNG_Data 00:02.263.286 • 128.59 MB ImageIO ImageIO_Malloc
答案 0 :(得分:4)
您是否使用+[UIImage imageNamed:]
加载图片?如果是这样,那些图像将由系统框架缓存,直到出现内存警告。您可以尝试使用+[UIImage imageWithContentsOfFile:]
以可以控制其生命周期的方式加载图像。
当出现内存警告时,系统框架将(理论上)释放通过+[UIImage imageNamed:]
缓存的图像,但我从经验中知道内存警告没有互锁 - 即您没有足够的时间来减少你的过程被杀之前你的消费。
根据您发布的代码:
-(IBAction)thisisanaction{
UIImage* letter = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"HelloWorld" ofType: @"png"]];
[imageholder setImage:letter];
这将使其无法在系统缓存中被无限期地保留。我不能说代码的其余部分是否正确处理,但这将消除+[UIImage imageNamed:]
的副作用。
答案 1 :(得分:0)
当使用+ [UIImage imageNamed:]来加载大量不同的图像时,我遇到了类似的内存问题,但ipmcc的使用+ [UIImage imageWithContentsOfFile:]的解决方案却解决了这个问题。非常感谢!