我的应用程序在屏幕上随机移动10个UIImageViews,一旦UIImageView到达角落,它就会改变它的图像。问题是:在应用程序之间切换并返回我的应用程序后,应用程序崩溃了。
控制台给了我这条消息:
"App" exited abnormally with signal 10: Bus error
崩溃日志说明了这一点:
Exception Type: EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000011
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
我认为问题是由于我使用的是UIImage imageNamed
,这里是代码:
在 ViewController.h 中:
UIImage *red;
UIImage *green;
UIImage *blue;
UIImageView *ballOne;
UIImageView *ballTwo;
UIImageView *ballThree;
UIImageView *ballFour;
// And declare UIImageView for other balls
int clr
在 ViewController.m :
中- (void)viewDidLoad {
...
red = [UIImage imageNamed: @"redTexture.png"];
green = [UIImage imageNamed: @"greenTexture.png"];
blue = [UIImage imageNamed: @"blueTexture.png"];
...
}
- (void)moveAll:(NSTimer *)theTimer{
...
// If UIImageView touches a corner, Do this:
clr = arc4random()%3 + 1;
switch (clr) {
case 1:
[ballOne setImage:red];
break;
case 2:
[ballOne setImage:green];
break;
case 3:
[ballOne setImage:blue];
break;
default:
break;
}
// And do this for the rest of 9 "balls"
}
为什么我的应用程序崩溃,我该如何解决?
谢谢!
答案 0 :(得分:4)
[UIImage imageNamed:]返回UIImage的自动释放实例。这意味着一旦事件循环结束,内存就会被释放。
你需要通过调用来保留这些实例。
[[UIImage imageNamed:@"blabl.png"] retain]
或(首选方法)将蓝色,红色,绿色成员设置为属性
@property(nonatomic, retain) UIImage* red;
你的代码就像:
- (void)viewDidLoad {
...
self.red = [UIImage imageNamed: @"redTexture.png"];
self.green = [UIImage imageNamed: @"greenTexture.png"];
self.blue = [UIImage imageNamed: @"blueTexture.png"];
...
}
当然,不要忘记在完成其他操作时释放它们,你将拥有与现在相反的东西:内存泄漏。
发布红色,请致电
[red release]
在dealloc方法中。
答案 1 :(得分:1)
总线错误意味着您正在尝试访问CPU实际无法访问的内存。你可能有一个迷路指针。
也许尝试一下内存分配调试器?