Почему моя программа какао получает EXC_BAD_ACCESS во время запуска?
-
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();вызовы, которые перейдут в отладчик.