Когда вы получаете EXC_BAD_ACCESS
, это часто означает, что вы пытаетесь вызвать метод для объекта, которого там нет - возможно, потому, что он был освобожден.
Примерно на полпути вниз, есть некоторые предупреждения о памяти вызовов, таких как:
#12 0x30a00710 in -[UIApplication _performMemoryWarning] ()
Из-за этого кажется, что ни один из ваших кодов не напрямую , вызывающий сбой, а скорее системное уведомление, когда память заканчивается.
Ближе к кадру # 0, похоже, он пытается очистить кэш объекта UIImage
, и это, похоже, неверный доступ.
Исходя из этого, можно предположить, что вы присваиваете указатель автоматически возвращаемому значению вспомогательного конструктора; затем объект автоматически высвобождается, и вы можете подумать, что это нормально, потому что вы не используете изображение напрямую, но предупреждение памяти пытается получить к нему доступ. Например:
@interface MyClass {
UIImage* myImage;
}
// ...
- (id) init { /* the usual stuff */
myImage = [UIImage imageNamed:@"bob_the.png"];
return self;
}
В этом примере, даже если у вас установлено свойство сохранения на myImage
, вы на самом деле не сохраняете изображение, если не установите значение с помощью self.myImage
. Итак, вскоре после этого звонка изображение обнуляется, и вы получаете указатель на ничейную землю.
Не видя код, у меня нет возможности узнать, действительно ли это происходит, но это один тип ошибок, который легко совершить.
Эти связанные вопросы дают советы по подобным сбоям: EXC_BAD_ACCESS
отладка вопрос 1 и вопрос 2 .
Наконец, если ничего из этого не поможет, я предлагаю найти минимальное воспроизведение вашей проблемы. Трудный способ сделать это - скопировать ваш код, вырезать половину, посмотреть, все ли еще есть ошибки, и повторять до тех пор, пока вы не получите наименьший найденный код, который воспроизводит ошибку. Оттуда обычно гораздо проще отлаживать (и, кроме того, более выносливый вопрос о переполнении стека!) Если вы знаете простой способ, дайте мне знать.