Способ поймать EXC_BAD_ACCESS при загрузке файла - PullRequest
2 голосов
/ 12 ноября 2011

Я использую UIDocument для загрузки файлов. Теперь я повредил файл, чтобы посмотреть, что происходит и как работает мое приложение. Он завершится с EXC_BAD_ACCESS, и мне было интересно, как мне справиться с такими сценариями. Я просто надеюсь , что файл никогда не будет поврежден? В дни до UIDocument я использовал @try и @catch для NSEXCEPTION, но это не будет работать с EXC_BAD_ACCESS. Это тот случай, когда я бы использовал NSZOMBIE? Насколько я понимаю другие посты, NSZombie используется только для целей отладки и не совсем то, на что вы всегда должны полагаться. Вот строка кода, которая выдает EXC_BAD_ACCESS, если я испортил свои данные:

 -(BOOL)loadFromContents:(id)contents ofType:(NSString *)typeName error:(NSError **)outError {

if (!_books) {
        _books = [[NSMutableArray alloc] init];
    }

        self.books = [NSKeyedUnarchiver unarchiveObjectWithData:contents]; // THIS WILL CRASH IF CONTENTS GOT CORRUPTED

        if ([_delegate respondsToSelector:@selector(libraryDocumentUpdated:)]) {
            [_delegate libraryDocumentUpdated:self];
        }

        return YES;
    }

Спасибо за любые предложения.

Ответы [ 2 ]

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

EXEC_BAD_ACCESS - это не исключение, которое вы ловите, оно говорит вам, что вы обращаетесь к неверному адресу памяти, что приводит к сбою.NSZombies - это просто способ сохранить все объекты, которые должны были быть освобождены, «живыми» (следовательно, не освобождая память, которую они занимают, что явно не то, что вам нужно в сборке релиза), чтобы сказать вам, какой «освобожденный» выобмена сообщениями.Вам необходимо выяснить, почему вы получаете EXEC_BAD_ACCESS.Является ли книга оставшейся собственностью?

0 голосов
/ 15 марта 2019

Вы должны выяснить причину сбоя и устранить ее. Если вы действительно хотите поймать EXC_BAD_ACCESS, вы можете. Новая библиотека C SignalRecovery может позволить программам восстанавливаться после исключений операционной системы, таких как EXC_BAD_ACCESS. Может использоваться в iOS / macOS / Linux. Пример кода:

signal_try(label) {
    // Add your code need try.
    int* ptr = NULL;
    *ptr = 0;
}
signal_catch(label) {
    // Add your code to process exceptions, or do nothing.
    siginfo_t* info = signal_info();
}
signal_end(label)
// Continue run
...