Приложение вылетает на iOS5 после dealloc - PullRequest
0 голосов
/ 25 октября 2011

У меня проблема с запуском приложения на iOS 5, которое отлично работает на iOS 4.3. Я преобразовал проект в ARC, так что ARC должен быть полностью отключен, и насколько я понял, приложение должно работать так, как всегда с ручным подсчетом ссылок? В настоящее время происходит сбой после метода dealloc (после вызова [super dealloc]), точнее, он получает EXC_BAD_ACCESS для этой части:

int main (int argc, char * argv []) {

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int retVal = UIApplicationMain(argc, argv, nil, nil); //EXC_BAD_ACCESS

[pool release];

return retVal;

}

Я пытался преобразовать в ARC, но в настоящее время это невозможно, поскольку у меня есть сторонняя библиотека JSON, которая не поддерживается. Я попытался поставить флаг компилятора на все соответствующие файлы:

-fno-ObjC-дуга

Однако это не имеет никакого значения при попытке преобразования в ARC, поскольку появляются те же ошибки, что и раньше, и, кроме того, Xcode удаляет флаги из файлов после неудачной попытки.

Кто-нибудь знает, что здесь происходит? Я бы предположил, что если ARC отключен, то такие вызовы, как release, должны быть в порядке?

Ответы [ 2 ]

4 голосов
/ 25 октября 2011

Похоже, что изменение структуры с iOS 4 на iOS 5.0 означает, что вы нажимаете на висячий указатель. EXEC_BAD_ACCESS в main обычно является признаком того, что объект в пуле автоматического выпуска уже был освобожден, т. Е. Он был слишком освобожден или недостаточно сохранен.

Я столкнулся с такой же проблемой с UIImagePickerController в одном из моих проектов.

Зомби - хороший способ исследовать проблемы с авто-выпуском. Чтобы включить зомби в Xcode 4.1 или 4.2, на вкладке «Диагностика» этапа «Выполнить» есть флажок «Включить объекты зомби».

Когда зомби включены, вы должны получить исключение в консоли, где вы ранее нажимали EXEC_BAD_ACCESS. Это исключение сообщит вам информацию об объекте.

1 голос
/ 28 октября 2011

Я обнаружил проблему, я устанавливал класс как делегат чего-то другого, проблема была решена, когда я установил для делегата значение nil в методе dealloc. Это было полностью проигнорировано в iOS4, но похоже, что iOS5 более чувствительна к этим вещам. Спасибо за вашу помощь!

...