切换后iPhone App崩溃,可能是由于UIImage imageNamed

Noo*_*one 5 iphone crash memory-management imagenamed

嘿伙计们,这可能是一个显而易见的事情,但我无法弄清楚.

我的应用程序在屏幕上随机移动10个UIImageViews,一旦UIImageView到达角落,它就会改变它的图像.问题是:在应用程序之间切换并返回我的应用程序后,应用程序崩溃了.

控制台给我这个消息:

"App" exited abnormally with signal 10: Bus error
Run Code Online (Sandbox Code Playgroud)

崩溃日志说明了这一点:

Exception Type:  EXC_BAD_ACCESS (SIGBUS)

Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000000000011

Crashed Thread:  0  Dispatch queue: com.apple.main-thread
Run Code Online (Sandbox Code Playgroud)

认为问题是由于我正在使用的事实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
Run Code Online (Sandbox Code Playgroud)

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" 
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Vde*_*edT 4

[UIImage imageNamed:] 返回 UIImage 的自动释放实例。这意味着一旦事件循环结束,内存就会被释放。

您需要通过调用来保留这些实例。

[[UIImage imageNamed:@"blabl.png"] retain]
Run Code Online (Sandbox Code Playgroud)

或者(首选方法)将蓝色、红色、绿色成员设置为属性

@property(nonatomic, retain) UIImage* red;
Run Code Online (Sandbox Code Playgroud)

你的代码将是这样的:

- (void)viewDidLoad {
  ...
  self.red = [UIImage imageNamed: @"redTexture.png"];
  self.green = [UIImage imageNamed: @"greenTexture.png"];
  self.blue = [UIImage imageNamed: @"blueTexture.png"];
  ...
}
Run Code Online (Sandbox Code Playgroud)

当然,完成后不要忘记释放它们,否则您将遇到与现在相反的情况:内存泄漏。

要释放红色,请调用

[red release]
Run Code Online (Sandbox Code Playgroud)

在dealloc方法中。