iPhone UIImage — рандомизатор изображений дает сбой, если дважды встречается одно и то же изображение

Я создаю игру, которая извлекает изображения случайным образом. Проведя некоторое тестирование, я понял, что если одно и то же изображение вызывается дважды, оно падает. Я узнал об этом, пройдя первую игру, вернувшись в главное меню игры и выбрав игру снова. В итоге я получил изображение, которое уже отображалось в моей предыдущей игре, а через секунду мое приложение вылетело из строя. Я провел некоторое тестирование и сделал так, чтобы одно и то же изображение появлялось дважды во время моей первой игры, и оно вылетало через секунду после того, как изображение отображалось во второй раз.

Вот пример кода. «idNum» и «timer» объявлены в файле .h, поэтому они являются глобальными. Как вы можете видеть, у меня есть NSTimer, который запускается каждую секунду, чтобы рандомизировать новое изображение для извлечения. Работает, пока изображение не попытается показать во второй раз. Скажем, я получаю случайный порядок 1,3,2,5,3. Он рухнет на второй 3.

Вы не можете вызвать изображение дважды? Я могу только думать, что это проблема с кэшированием, я не знаю, как освободить кеш изображения. Я получаю сообщение об ошибке objc_msgSend. Извините, не очень хорошо разбираюсь в отладке сбоев.

//idNum = the randomly generated integer
//pictures are called by numbers ex(1.jpg, 5.jpg)



timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeCounter) userInfo:nil repeats:YES];


-(void)timeCounter {
time = time + 1;

    idNum = (arc4random() % 5);

    NSString * imgIDnum = [[NSString alloc] initWithFormat:@"%d", idNum];
    imgMain = [NSString stringWithFormat:@"%@%@", imgIDnum, @".jpg"];
    [imgIDnum release];

    UIImage * daImg = [UIImage imageNamed:imgMain];
    [imgView setImage:daImg];



  }

person bbullis21    schedule 02.09.2009    source источник
comment
Вам нужно будет предоставить некоторые подробности сбоя, который может быть не напрямую вызван опубликованным вами кодом, а также откуда берется idNum и уверены ли вы, что в imgMain есть правильный путь к изображению?   -  person paulthenerd    schedule 03.09.2009
comment
Я добавил больше деталей, надеюсь, это поможет.   -  person bbullis21    schedule 03.09.2009


Ответы (2)


Вы должны предоставить больше информации о сбое. Это в строке +imageNamed: выше или, возможно, в строке -setImage:?

Наиболее вероятная причина в том, что вы чрезмерно выпускаете файл UIImage. Например, если вы вызываете [daImg release] после приведенного выше кода, вы получите такое поведение, потому что вы перевыпускаете что-то, что кэшируется классом UIImage. Это не приведет к сбою до описанной вами ситуации.

Я видел действительно забавную версию этой ошибки: мой товарищ по команде чрезмерно выпускал NSNumber (большую часть времени это было для целого числа 2). NSNumbers кэшируются внутри, поэтому в следующий раз, когда он создаст NSNumber для целого числа 2 в несвязанной части программы, произойдет сбой. Любое другое число было в порядке, но попробуйте NSLog() 2, и бум.

person Rob Napier    schedule 02.09.2009
comment
Да, это очень похоже на то, что здесь происходит. Я рандомизирую числа, соответствующие jpg, и как только я достигаю jpg, который уже был выбран, прежде чем он вылетит у меня. Есть ли простой способ удалить изображение из кэша? Мне не нужно кешированное изображение. - person bbullis21; 03.09.2009
comment
Во-первых, исправьте оверрелиз. Проблема не в кеше; это ваше управление памятью. Затем, если вы не хотите кэшировать, не используйте +imageNamed:. Это явно для кэширования изображений. Прочтите «Образы и управление памятью» в UIImage для получения дополнительной информации, а также документацию по +imageNamed:. - person Rob Napier; 03.09.2009
comment
Я попытался удалить [выпуск daImg] в своем коде, и это не имело значения. Я все еще получил тот же результат при втором отображении изображения. - person bbullis21; 03.09.2009
comment
Является ли imgMain иваром? Вы не можете сохранить его, что вполне может привести к несвязанному сбою. Если imgMain и timer являются ivar, вам нужно узнать об использовании аксессоров. Никогда не разговаривайте с иварами напрямую (за исключением аксессоров и, возможно, Dealloc). Всегда используйте аксессор. Вы убережете себя от многих аварий. developer.apple.com/mac/library/ документация/Какао/Концептуальные/ - person Rob Napier; 03.09.2009

Что ж, мне жаль говорить, что я исправил проблему и понятия не имею, как это сделать. В итоге я переписал большую часть этого кода, добавив, удалив и изменив некоторые фрагменты, чтобы упростить управление памятью. Когда я снова запустил его, все было в порядке. Извините за отсутствие решения. Если кто-то еще столкнется с этой проблемой, дайте мне знать, я постараюсь помочь.

person bbullis21    schedule 03.09.2009