Приложение iPhone падает после переключения, возможно, из-за UIImage imageNamed - PullRequest
5 голосов
/ 19 декабря 2010

Эй, ребята, это может быть очевидной вещью, но я не могу понять это.

Мое приложение перемещает 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

I думаю, проблема связана стот факт, что я использую 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" 
}

Почему происходит сбой моего приложения и как его решить?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 19 декабря 2010

[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 голос
/ 19 декабря 2010

Ошибка шины означает, что вы пытаетесь получить доступ к памяти, к которой физически процессор не может получить доступ.Вероятно, у вас неправильный указатель.

Может, попробовать отладчик выделения памяти?

...