首先,我想说这个网站太棒了!在创建我的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-我该如何解决这个问题?
感谢您的所有帮助! 谢谢!
答案 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