应用程序从后台恢复后,如何防止UIImage消失?总览

时间:2011-06-26 15:12:48

标签: ios background uiimage multitasking retain

我有一个UIImage * loadedPoofSprite我初始化如下:

NSMutableDictionary* loadedDictionary=[NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"%@/%@",Main_Bundle_Path,poofConfigFileName]];
NSString *textureFileName = [[loadedDictionary objectForKey:@"metadata"] valueForKey:@"textureFileName"];
loadedPoofSprite = [UIImage imageNamed:textureFileName]; 

poofImage = [[UIImage imageNamed:textureFileName] CGImage];

从那里我使用我的poofImage,一切似乎都很好,直到我的应用程序从后台恢复。我得到了崩溃'因为loadedPoofSprite消失了。我认为避免这种情况的方法是保留loadedPoofSprite,如下所示:

[loadedPoofSprite autorelease];
loadedPoofSprite = [[UIImage imageNamed:textureFileName] retain]; 

这有效,但有人提出这不是正确的方法,我应该在applicationWillEnterForeground中再次加载loadedPoofSprite。我不明白为什么最好加载两次而不是保留它。处理上述问题的正确方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

如果您要将loadedPoofSprite设为保留属性,请将其指定为:

self.loadedPoofSprite = [UIImage imageNamed:textureFileName];
然后一切都会没事的。保留属性使用

声明
@property (nonatomic,retain) UIImage *loadedPoofSprite;

你需要使用

生成一个getter / setter
@synthesize loadedPoofSprite;

然后在dealloc例程中,添加self.loadedPoofSprite = nil;以在需要时释放图像。

答案 1 :(得分:0)

您没有指定对loadedPoofSprite / poofImage执行的操作。 可能问题与保留/释放无关:例如,如果您将图像作为子视图添加到另一个视图(通过UIImageView),框架会自动保留您的图像,因此不应该要求自己保留图像并且可以防止在系统需要时卸载它。

实际上,您的应用程序可能在后台受到系统的影响,系统会尝试恢复内存,以便运行其他应用程序;在这种情况下,您的视图将被释放,可能已取消分配,并且在恢复到前台时,您的应用程序将无法找到其视图。因此失败了。

如果我的推理适用,您需要检查您的UIViews是否存在并准备根据需要重新加载/重新创建它们(由关于didReceiveMemoryWarning/viewWillLoad/viewDidUnload的文档指定)。