0

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

现在,我的问题是:

当我启动我的应用程序时,我有一个 UIImageView 加载图像取决于 if/else 语句

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

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

BG.image = someImage;

当然,BG 是 UIImageView,someImage 是带有@property、@synthesis 的 iVar。someImage 在 vi​​ewDidLoad 中使用来自主包的图像进行初始化:

- (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- 为什么我的应用程序从后台返回后会崩溃 2- 我该如何解决?

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

4

2 回答 2

2

我猜崩溃是 EXC_BAD_ACCESS (但我猜是因为您没有发布该信息)。

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

于 2010-09-23T16:58:23.743 回答
0

当你这样做时:

- (void)viewDidLoad {

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

    [super viewDidLoad];
}

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

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

或使用您的合成设置器,它将自动保留它:

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

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

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

所有在功能上都是等效的。#2 或 #3 是最好的。

苹果的“内存管理规则”指南会救你一命:http: //developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/ 20000994-BAJHFBGH

于 2010-09-23T17:08:01.307 回答