EXC_BAD_ACCESS при удалении представления

У меня проблема с EXC_BAD_ACCESS.

У меня есть UIWebView, который загружает локальный файл HTML, и когда приложение загружает содержимое представления, я отображаю UIView поверх него как «заставку». Затем, когда содержимое UIWebView загружено, я запускаю анимацию, чтобы исчезнуть UIView и удалить его из памяти.

- (void) webViewDidFinishLoad:(UIWebView *)webView {
        [UIView animateWithDuration:1
                 animations:^{
                      loadingView.alpha = 0.0;
                 }
                 completion:^(BOOL finished){
                     [loadingView removeFromSuperview];
                     [loadingView release];
                 }];
}

Проблема в том, что когда я использую мое приложение, происходит сбой в двух строках метода завершения. Полная ошибка:

Program received signal:  “EXC_BAD_ACCESS”.
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.3 (8F190)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).

LoadView строится через построитель интерфейса. Вот иерархия:

Изображение


person Dan Hanly    schedule 25.03.2011    source источник
comment
пожалуйста, опубликуйте код, где вы создаете loadingView.   -  person Matthias Bauch    schedule 25.03.2011
comment
он встроен в конструктор интерфейсов. На нем есть заставка с изображением и индикатор активности. См. изображение выше   -  person Dan Hanly    schedule 25.03.2011


Ответы (2)


Похоже, вы дважды выпускаете представление.

Ваш супервизор сохранит ссылку на изображение-заставку. Это будет выпущено, когда вы removeFromSuperview.

Если это единственная ссылка на изображение-заставку, то следующая строка, релиз, будет over-релизом и вызовет сбой. Судя по приведенному вами коду, решение состоит в том, чтобы удалить явный выпуск.

Однако, если кода больше, чем вы показали, он может быть немного сложнее, хотя идея та же.

person Stephen Darlington    schedule 25.03.2011

исключение может быть вызвано выпуском, когда вы раньше не сохранили loadingView.

Если вы не сохраняете (например, с сохранением свойства), вам не разрешено освобождать представление.

Но чтобы избежать утечки, вы должны дважды проверить, можно ли просто удалить файл [loadingView release].

person Matthias Bauch    schedule 25.03.2011