5

私のアプリは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の場合

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" 
}

アプリがクラッシュするのはなぜですか?また、どうすれば解決できますか?

4

2 に答える 2

4

[UIImage imageNamed:]は、UIImageの自動リリースされたインスタンスを返します。これは、イベントループが終了するとすぐにメモリが解放されることを意味します。

Yoは、を呼び出すことによってそれらのインスタンスを保持する必要があります。

[[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メソッドで。

于 2010-12-19T11:36:20.493 に答える
1

バスエラーは、CPUが物理的にアクセスできないメモリにアクセスしようとしていることを意味します。おそらく、迷子のポインタがあります。

たぶん、メモリ割り当てデバッガを試してみてください。

于 2010-12-19T11:24:10.673 に答える