2011-11-12 2 views
2

파일을로드하는 데 UIDocument를 사용하고 있습니다. 나는 지금 어떤 일이 일어나고 내 앱이 어떻게 작동하는지보기 위해 파일을 손상시켰다. 그것은 EXC_BAD_ACCESS와 충돌 할 것이고 나는 지금 어떻게 그런 시나리오를 처리해야하는지 궁금해하고있다. 파일이 손상되지 않겠습니까? pre-UIDocument 시절에는 NSEXCEPTION에 @try와 @catch를 사용했지만 EXC_BAD_ACCESS에서는 작동하지 않습니다. NSZOMBIE를 사용하는 경우입니까? 다른 게시물을 이해하는 한, NSZombie는 디버깅 용도로만 사용되며 항상 의존해야하는 것은 아닙니다. 다음은 데이터를 손상시킬 경우 EXC_BAD_ACCESS를 던지는 코드 행입니다.파일을로드 할 때 EXC_BAD_ACCESS를 catch하는 방법

-(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; 
    } 

고마워요.

+1

동일한 문제가 있습니다. loadFromContents가 유효하지 않은 내용 객체를 전달하므로 아카이브가 중단됩니다. 분명히, 나에게, 버그는 iCloud에 있으며, 결코 잘못된 객체를 전달해서는 안되지만, 그렇지 않습니다. – pstoppani

답변

1

EXEC_BAD_ACCESS는 사용자가 잘못된 메모리 주소에 액세스하고 있음을 알리는 예외입니다. 따라서 충돌이 발생합니다. NSZombies는 "해제"해야 할 모든 객체를 유지하는 방법 일뿐입니다 (따라서 릴리스 빌드에서 분명히 원하는 것이 아닌, 점유하고있는 메모리를 해제하지 않음) 어떤 "할당 해제"되었는지를 알려주는 것입니다 메시지. EXEC_BAD_ACCESS를받는 이유를 알아야합니다. 서적은 보존 된 속성입니까?

+0

예, 다음과 같습니다 : @property (비 원자력, 강함) NSArray * books; 그러나 데이터를 손상시킬 경우 왜 내가 이것을 얻는 것인지 이해할 수 없습니다. 위의 예제에서 생략 한 다른 코드 줄이 있습니다. 방금 추가했습니다. 아마도 그 이유가 될 것입니다. 당신의 도움을 주셔서 감사합니다! –

+0

아, 주 파일에 있습니다 : @synthesize books = _books; 그것은 기본적입니다. –

+1

이 줄은 없어야합니다 _books = [[NSMutableArray alloc] init]; (self.books = [[NSMutableArray alloc] init]이어야합니다.) 그리고 어쨌든 unarchive로 재 할당하면 아무런 도움이되지 않습니다. – jbat100

관련 문제