我有一个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。我不明白为什么最好加载两次而不是保留它。处理上述问题的正确方法是什么?
谢谢!
答案 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
的文档指定)。