2012-02-15 4 views
0

iPad의 파일 시스템에 개체를 저장하려고하는데 잘못된 것 같습니다. 다음은 객체를 보관 한 방법입니다.파일 저장에 대해 알아낼 수 없습니다.

NSString *localizedPath = [self getPlistFilePath]; 
NSString *fileName = [NSString stringWithFormat:@"%@.plist", character.infoName]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:character]; 

fileName = [fileName stringByReplacingOccurrencesOfString:@" " withString:@"_"]; 
localizedPath = [localizedPath stringByAppendingPathComponent:fileName]; 

NSLog(@"File Path: %@", localizedPath); 

if(data) { 
    NSError *writingError; 

    BOOL wasWritten = [data writeToFile:localizedPath options:NSDataWritingAtomic error:&writingError]; 

    if(!wasWritten) { 
     NSLog(@"%@", [writingError localizedDescription]); 
    } 
} 

이제는 파일 시스템에서보고 읽을 수있는 plist 파일을 만듭니다. 그래도 다음을 사용하여 아카이브를 삭제하려고하면 :

NSError *error; 
NSString *directory = [self getPlistFilePath]; 
NSArray *files = [[NSFileManager defaultManager]contentsOfDirectoryAtPath:directory error:&error]; 
NSMutableArray *characters = [[NSMutableArray alloc]init]; 

for(NSString *path in files) { 
    if(![path hasSuffix:@"plist"]) { 
     continue; 
    } 
    NSString *fullPath = [directory stringByAppendingPathComponent:path]; 
    NSData *data = [NSData dataWithContentsOfFile:fullPath]; 
    IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // get EXEC_BAD_ACCESS here... 
    [data release]; 

    [characters addObject:object]; 
} 

EXEC_BAD_ACCESS 오류가 발생합니다.

IRSkillsObject는 NSCoding 프로토콜을 따릅니다. 당신이 볼 수있는, 나는 오류가 발생 줄을 주석.

내가 잘못하고있는 것이 확실하지만 나는 그것을 볼 수 없다. 나는 디버거 (객체의 initWithCoder: 메소드에서 중단 점을 배치)를 단계별로 시도했지만 아무런 오류가 발생하지 않습니다. 사실, 그것은 내가 바라는대로 데이터를 객체에 적절히 배치합니다. 그러나 데이터로드가 완료되면 오류가 발생합니다. retain 메서드를 사용하여 시도했지만 도움이되지 않습니다.

당신이 제공 할 수있는 도움이 있으면 대단히 감사하겠습니다!

답변

1

EXEC_BAD_ACCESS 오류가 발견되면. 일반적으로 일부 데이터가 릴리스되었지만 여전히 코드에 필요하기 때문입니다.

아마 당신의 IRSkillsObject 내부 속성이 -initWithCoder:

+0

정확히 그랬습니다. 나는 객관적인 C와 메모리 관리 등 새로운면이있다. (나의 역사는 주로 .net에있다.). 데이터를 설정할 때 (예 :'infoName = [coder decodeObjectForKey : kNameKey];') 개체에 대한 iVar를 설정하고 항목을 릴리스했습니다. self.infoName = [coder decodeObjectForKey : kNameKey];'). –

3

할당하지 않고 data을 릴리스합니다.

NSData *data = [NSData dataWithContentsOfFile:fullPath]; 
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
[data release]; 

그래서이 시도 :

NSData *data = [[NSData alloc] initWithContentsOfFile:fullPath]; 
IRSkillsObject *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
[data release];  
+2

유지 또는 라인 [데이터 자료]를 제거하지 않습니다; – 0xDE4E15B

+0

좋아, 아마도 위의 방법으로 문제를 일으키는 것이 아닙니다. 내가 [NSData datawithContentsOfFile : fullPath];를'[[NSData alloc] initWithContentsOfFile : fullPath];로 대체하면 같은 일을한다. 내 물건으로 뭔가있을 수 있을까요? 감사합니다. –

+0

같은 폴더에 다른 plist 파일이 있습니까? 그렇다면 모두 삭제하고 다시 보관/보관 취소를 시도하십시오. – iDifferent