ios @try @catch блокирует EXC_BAD_ACCESS по возвращении из @catch

Этот блок @try-@catch в моем представленииDidLoad аварийно завершает работу с EXC_BAD_ACCESS при возврате; выполняется в улове, и предупреждение также не отображается:

    @try
    {        
        errorText = @"thumbnails_array";

        unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        // Customize unarchiver here
        self.thumbnails_array = [unarchiver decodeObjectForKey:@"thumbnails_array"];
        [unarchiver finishDecoding];
        [unarchiver release];


        errorText = @"ThumbNailViewController";

        archivePath = [app.phojoArchiveDir stringByAppendingPathComponent:@"ThumbNailViewController.archive"];
        data = [NSData dataWithContentsOfFile:archivePath];
        unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        // Customize unarchiver here
        [unarchiver decodeObjectForKey:@"self"];
        [unarchiver finishDecoding];
        [unarchiver release];

        errorText = @"assetsGroupURL";

        archivePath = [app.phojoArchiveDir stringByAppendingPathComponent:@"assetsGroupURL.archive"];
        data = [NSData dataWithContentsOfFile:archivePath];
        unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
        // Customize unarchiver here
        app.assetsGroupURL = [unarchiver decodeObjectForKey:@"assetsGroupURL"];
        [unarchiver finishDecoding];
        [unarchiver release];


    }
    @catch (NSException *exception) 
    {
       UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Phojo is unable to restore the previous editing session." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
        [alert release];

        NSLog(@"Exception %@ thrown while unarchving %@: Reason: %@ Items in userInfo = %d Stack Trace: %@", [exception name], errorText, [exception reason], [[exception userInfo] count], [NSThread callStackSymbols]);  
        [self.thumbnails_array   release];
        self.thumbnails_array = nil;
        [app.assetsGroupURL release];
        app.assetsGroupURL = nil;

        return;


    }

Этот код запускается в viewDidLoad для извлечения данных, которые были заархивированы во время предыдущего запуска приложения. Я получил исключение в этом коде о том, что архив непонятен. Но с его сбоем нет никакого способа заставить приложение работать вообще, так как оно вылетает при запуске, а также при улове. Любые идеи?


person user953175    schedule 10.02.2012    source источник
comment
Обратите внимание, что исключения в Cocoa не предназначены для устранения ошибок. На самом деле Apple заявляет, что управление памятью с помощью ARC намеренно разбивается на исключения: blog.random-ideas .net/?p=98 . Вам, вероятно, лучше попытаться вообще избежать исключений кода, чем пытаться восстановиться после них.   -  person Brad Larson    schedule 10.02.2012


Ответы (1)


Либо ваши свойства assetsGroupURL, либо thumbnails_array (или оба) объявлены как retain. Это нормально, но это означает, что когда вы вызываете как [self.theProperty release], так и self.theProperty = nil, вы освобождаете theProperty дважды: второй вызов использует сгенерированный retain сеттер и неявно вызывает release также для его текущего значения. Удалите вызовы release, и вы больше не увидите EXC_BAD_ACCESS.

person Noah Witherspoon    schedule 10.02.2012
comment
Ты так прав! Спасибо, что заметили это... однако... по-прежнему происходит сбой с EXC_BAD_ACCESS... Я очень ценю, что вы указали на этот двойной выпуск, так как в конечном итоге это может стать проблемой. - person user953175; 10.02.2012