从后台返回后,我的iPhone应用程序崩溃了。原因:UIImage问题

时间:2010-09-23 16:53:37

标签: iphone uiimage ios4 instance-variables

首先,我想说这个网站太棒了!在创建我的iPhone应用程序时,它帮助我做了很多事情。

现在,我的问题是:

当我启动我的应用程序时,我有一个UIImageView根据

中的if / else语句加载图像

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

方法。这些图像分配如下:

BG.image = someImage;

当然,BG是UIImageView,而someImage是带有@property的@Vy的iVar。 someImage使用viewDidLoad中主要包的图像进行初始化:

- (void)viewDidLoad {

//init stuff from file
someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"];

[super viewDidLoad];}

我的应用程序运行愉快,根据touchBegan(如上所述)加载图像,但是!

当我的应用程序被发送到后台并返回时,它会在第一次触摸时崩溃。

当我更换时:

BG.image = someImage

使用:

BG.image = [UIImage imageNamed:@"FirstViewBG_5N.png"];

它跑得很开心?!我认为someImage会被刷新或腐败吗?

我不想这样离开,因为imageNamed方法每次从磁盘读取,这会导致性能问题,我想?

我认为我的问题很明确?就是这样:

1-为什么我的应用程序会在从backgroud返回后崩溃 2-我该如何解决这个问题?

感谢您的所有帮助! 谢谢!

2 个答案:

答案 0 :(得分:2)

我猜这次崩溃是EXC_BAD_ACCESS(但我猜是因为你没有发布那些信息)。

如果“someImage”是一个实例变量,你应该合成它并使用它的访问器(self.someImage),以便保留或复制它。就目前而言,你正在为someImage分配一些内容,但是当你稍后尝试访问它时它已经消失了。

答案 1 :(得分:0)

执行此操作时:

- (void)viewDidLoad {

    //init stuff from file
    someImage = [UIImage imageNamed:@"FirstViewBG_5N.png"];

    [super viewDidLoad];
}

imageNamed方法返回一个自动释放的对象,在viewDidLoad返回后由垃圾回收器清理。试着保留它:

    someImage = [[UIImage imageNamed:@"FirstViewBG_5N.png"] retain];

或使用合成的setter自动保留它:

    [self setSomeImage:[UIImage imageNamed:@"FirstViewBG_5N.png"]];

或使用UIImage的initWithData初始化程序:

    someImage = [[UIImage alloc] initWithContentsOfFile:@"FirstViewBG_5N.png"];

所有功能都相同。 #2或#3是最好的。

Apple的“内存管理规则”指南将拯救您的生命:http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH