Почему моя программа какао получает EXC_BAD_ACCESS во время запуска? - PullRequest
3 голосов
/ 15 сентября 2008

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

Ответы [ 6 ]

5 голосов
/ 16 сентября 2008

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

2 голосов
/ 16 октября 2008

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

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

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

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

Проверьте любые awakeFromNib методы, чтобы убедиться, что вы не переиздаваете объекты и т.д.

1 голос
/ 15 ноября 2011

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

0 голосов
/ 19 сентября 2008

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

0 голосов
/ 16 сентября 2008

Добавить: главная причина разархивирования - забыть «вернуть себя» из -init пользовательского класса. Это очень больно: (

0 голосов
/ 15 сентября 2008

Это одна из возможных причин. Существует объект 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 (); вызовы, которые прервутся к отладчику.

...