iPhone应用程序在切换后崩溃,可能是由于UIImage ImageName

iPhone应用程序在切换后崩溃,可能是由于UIImage ImageName,iphone,memory-management,crash,imagenamed,Iphone,Memory Management,Crash,Imagenamed,我的应用程序在屏幕上随机移动10个UIImageView,一旦UIImageView出现在角落,它就会改变图像。问题是:在应用程序之间切换并返回到我的应用程序后,应用程序崩溃 控制台向我发出以下信息: "App" exited abnormally with signal 10: Bus error 崩溃日志表明: Exception Type: EXC_BAD_ACCESS (SIGBUS) Exception Codes: KERN_PROTECTION_FAILU

我的应用程序在屏幕上随机移动10个UIImageView,一旦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中:

在ViewController.m中:


为什么我的应用程序会崩溃,我该如何解决它?

总线错误意味着您试图访问CPU物理上无法访问的内存。你可能有一个迷路的指针


也许可以尝试内存分配调试器?

[UIImage ImageName:]返回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]

在Dealoc方法中。

嘿,大卫,谢谢你的回复。这是我为iPhone开发的第三天。你能建议如何避免在查看我的代码时出现这种情况吗?我很高兴,别忘了将问题标记为“已回答”。(答案左边灰色复选标记)一件小事:当我不使用“self”时,没有任何变化,但使用“self”时,你的方法起了作用。你能解释一下为什么会有这么大的不同吗?这只是通过给self打电话。如果引用属性及其保留机制,则只需直接访问成员,而不会从属性功能中获益。阅读apple doc,我特别推荐一篇内存管理文章,如果能很好地理解,它将避免数小时的调试。干杯
- (void)viewDidLoad {
  ...
  self.red = [UIImage imageNamed: @"redTexture.png"];
  self.green = [UIImage imageNamed: @"greenTexture.png"];
  self.blue = [UIImage imageNamed: @"blueTexture.png"];
  ...
}
[red release]