Почему моя программа какао получает EXC_BAD_ACCESS во время запуска?

StackOverflow https://stackoverflow.com/questions/64881

  •  09-06-2019
  •  | 
  •  

Вопрос

Во время загрузки моего приложения какао моя программа выходит из строя с сообщением EXC_BAD_ACCESS.Трассировка стека бесполезна.Есть какие-нибудь подсказки, как мне найти проблему?

Это было полезно?

Решение

Я видел случаи, когда это могло произойти, когда вы пытались получить доступ к объекту, который вы не сохранили должным образом, поэтому он либо не указывал на действительную копию вашего объекта, либо указывал на объект другого типа.Лучше всего размещать точки останова на ранней стадии и анализировать объекты по мере запуска с использованием po и печати в GDB.

Другие советы

Обычно это указывает на ошибку управления памятью.

Убедитесь, что все декларации ваших торговых точек соответствуют передовой практике:

@interface MyClass : MySuperclass {
    UIClass *myOutlet;
}
@property (nonatomic, retain) IBOutlet UIClass *myOutlet;
@end

Этот формат гарантирует правильное управление памятью на любой платформе с любым суперклассом.

Отметьте любой awakeFromNib методы, гарантирующие, что вы не выпускаете слишком много объектов и т. д.

Новый ответ на старую тему...в XCode 4 наиболее эффективный способ диагностики исключений EXC_BAD_ACCESS — использовать инструменты для профилирования вашего приложения (в XCode нажмите «Продукт/Профиль» и выберите «Зомби»).Это поможет вам идентифицировать сообщения, отправленные освобожденным объектам.

Добавить:Основной причиной неотъемлемой неудачи является забывание «вернуть себя»; от -инит пользовательского класса.Это очень больно :(

Проверьте журнал консоли (Applications/Utilities/Console.app).Когда программа выходит из строя при запуске и что-то не так с инициализацией, она часто записывает туда несколько полезных сообщений об ошибках, прежде чем произойдет сбой.

Это одна из возможных причин.Существует объект IBOutlet, который не инициализируется, и сообщение вызывается с нулевым значением.Трассировка стека может выглядеть так:

#0    0x90a594c7 in objc_msgSend
#1    0xbffff7b8 in ??
#2    0x932899d8 in loadNib
#3    0x932893d9 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:]
#4    0x9328903a in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:]
#5    0x93288f7c in +[NSBundle(NSNibLoading) loadNibNamed:owner:]
#6    0x93288cc3 in NSApplicationMain
#7    0x00009f80 in main at main.mm:17

Поскольку трассировка стека бесполезна, вам придется просмотреть весь код, чтобы найти ошибку.Если по какой-то причине вы не можете установить точки останова на ранних этапах выполнения, попробуйте вставить Debugger();вызовы, которые перейдут в отладчик.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top