Приложение iPhone падает только в режиме релиза на 3G - PullRequest
6 голосов
/ 11 ноября 2010

У меня есть приложение, которое я пишу, которое падает, когда я вызываю addSubview для UIScrollView с "EXC_BAD_ACCESS". Это происходит только на iPhone 3G в режиме релиза и только на устройстве. Я отлично работаю во всех этих других конфигурациях:

iPhone 3G - режим отладки iPhone 3GS - режим отладки и выпуска iPhone 4 - режим отладки и выпуска Симулятор - все.

Кроме того, нет разумной причины, по которой это должно происходить. Мой объект не освобожден ни одним из моих кодов.

Ответы [ 5 ]

12 голосов
/ 20 мая 2011

Недавно у меня была точно такая же проблема, однако я не совсем уверен, что причина та же.Хотя я могу сказать вам, что это решило проблему для меня (хотя я все еще не полностью удовлетворен решением).

В конце концов, это похоже на проблему с компилятором, и это может подтвердить то, что другиесказал об оптимизации компилятора.Я использую Xcode 4.0 (сборка 4A304a).Проблема была с компилятором кода LLVM 2.0.В частности, один ключ: «Уровень оптимизации»

Отладка была установлена ​​на «Нет».Релиз был установлен на «Самый быстрый, самый маленький»

Изменение релиза на «Нет» исправило сбой (и аналогично изменение «Отладка» на «Самый быстрый, самый маленький» вызвало сбой приложения при запуске).

2 голосов
/ 11 ноября 2010

Я рекомендую вам использовать NSZombieEnabled , чтобы узнать, что вызывает плохой доступ к памяти.

  • Используете ли вы DEBUG / RELEASE определения для ветвления вашего кода?
  • Вы используете средства проверки версии SDK для ветвления вашего кода?

В противном случае я могуне вижу, как ваше приложение может вести себя по-разному на разных устройствах / конфигурациях.

1 голос
/ 13 января 2011

Могу предложить изменить уровень оптимизации настроек релиза на «Нет».Я встречал одну и ту же проблему несколько раз (с разными приложениями) и решал ее таким образом.

0 голосов
/ 19 ноября 2010

Вы говорите: " Мой объект не освобожден ни одним из моих кодов ". Я обнаружил, что в Objective-C весьма распространено сталкиваться с ситуациями, когда ваш код явно не освобождает объект, но объект все же освобождается. Например, скажем так, что у вас есть объект № 1 с сохранением счетчика 1, и вы отпускаете его, но затем автоматически освобождаете его. Затем, за до пул авто-выпуска фактически истощается, вы выделяете новый объект # 2 - не исключено, что этот новый объект # 2 может быть размещен по тому же адресу, что и объект # 1. Поэтому при последующем сливе пула автоматического выпуска он автоматически освобождает объект № 2.

0 голосов
/ 19 ноября 2010

Я никогда не "решал" это, но я разыскивал код, нарушающий работу.Я подозреваю, что что-то в этом сегменте Кварцевого кода вызывало переполнение буфера где-то глубоко внутри ядра - и это только вызывало проблему в 3G.Некоторые настройки для этого сегмента не включены, но это определенно то, где это происходит:

gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations);
CGContextAddPath(context, path);
CGContextSaveGState(context);
CGContextEOClip(context);
transform = CGAffineTransformMakeRotation(1.571f);
tempPath = CGPathCreateMutable();
CGPathAddPath(tempPath, &transform, path);
pathBounds = CGPathGetPathBoundingBox(tempPath);
point = pathBounds.origin;
point2 = CGPointMake(CGRectGetMaxX(pathBounds), CGRectGetMinY(pathBounds));
transform = CGAffineTransformInvert(transform);
point = CGPointApplyAffineTransform(point, transform);
point2 = CGPointApplyAffineTransform(point2, transform);
CGPathRelease(tempPath);
CGContextDrawLinearGradient(context, gradient, point, point2, (kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation));
CGContextRestoreGState(context);
CGGradientRelease(gradient);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...