2011-04-11 4 views
1

나는있는 NSData을 사용하여 URL에서 이미지를 다운로드하고 일부 파일이 저장 불구하고 다시 (심지어 메시지를주지 않고 무작위로을 NSData writeToFile는 이유없이 충돌

NSData *dataForStorage = [NSData dataWithData:UIImagePNGRepresentation(img)]; 


    BOOL saveResult=[ dataForStorage writeToFile:jpegFilePath options:NSDataWritingAtomic error:&error]; 
    NSLog(@"Write returned error: %@", [error localizedDescription]); 

내 응용 프로그램 충돌을 사용하여 로컬 파일 시스템에 저장하고 무작위로). 디버그 모드에서 응용 프로그램을 실행할 때 "EXC_BAD_ACCESS"가 자주 표시되지만 계속 실행하면 일부 파일을 저장하는 데 성공합니다.

[self performSelectorInBackground:@selector(loadImageInBackground:) withObject:arr]; 

제안하십시오 :

이 코드에서 백그라운드에서 실행됩니다.

+1

크래시 로그와 콘솔 로그를 게시 할 수 있습니까? – Joze

+0

iOS에서는 iPhone 앱입니까, MacOS에서는 Mac 앱입니까? – Codo

+0

이것은 iPad 앱입니다. 2011-04-11 16 : 36 : 59.784 AJiPadPhotos [5881 : 7203] *** __NSAutoreleaseNoPool() : - 단지 2011-04 누출 클래스 NSHTTPURLResponse의 0x4e222c0이 자리에없는 풀과 오토 릴리즈 객체 여기에 콘솔 로그입니다 -11 16 : 36 : 59.784 AJiPadPhotos [5881 : 7203] *** __NSAutoreleaseNoPool() : 클래스 __NSCFData의 객체 0x4b41c80이 풀없이 자동으로 풀려 짐 - 방금 누출 됨 2011-04-11 16 : 36 : 59.785 AJiPadPhotos [5881 : 7203 ] *** __NSAutoreleaseNoPool() : NSConcreteData 클래스의 객체 0x4e23ba0이 풀없이 자동으로 풀립니다. –

답변

1

야생 추측 : arr은 자동 렌더링 된 개체이므로 선택기가 호출되기 전에 할당이 해제되는 경우가 있습니다. [arr copy]을 사용해보고 저장 한 다음 놓으십시오.

+1

다양한 performSelector 메서드의 withObject : 매개 변수가 유지되므로 문제는 아닙니다. –

+0

@Marcelo에 감사하지만 도움이되지 않았다. ( 다른 아이디어? –

1

코드의 문제 중 하나는 자동 실행 풀이없는 스레드에서 실행중인 코드가 있지만 필요한 기능을 사용하고 있다는 것입니다. loadImageInBackground 메서드에 다음 코드를 입력하십시오.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

// existing code 

[pool drain]; 

이것은 아마도 몇 가지 문제 중 하나 일뿐입니다. 추가 도움이 필요하면 충돌의 스택 추적을 확인해야합니다.

+0

안녕하세요. Codo, 답장을 보내 주셔서 감사합니다.나는 이미 이것들을 가지고 있으며, 간단하게 여기에서 그들을 제외 시켰습니다. 할 수있는 다른 일은 없습니까? –

+0

예, 충돌에 대한 스택 추적을 질문에 추가하십시오. – Codo

0

나는 똑같은 문제가 있었지만 문제는 뭔가 다른 것으로 밝혀졌습니다. 내 URL이 조기에 공개되고있었습니다.

내가이 호출했다 :

[self performSelectorInBackground:@selector(downloadData:) withObject:nil]; 

을 그리고 이것은 방법이다 :

// URL - (NSString) URL for file 
// filePath - (NSString) save location on device 
-(void)download:(NSString *)URL 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:URL]]; 
    [data writeToFile:filePath atomically:YES]; 
    [pool release]; 
} 

그래서 나는 당신의 다운로드 코드가 올바른지 생각 결국 이것은 내가 한 그것은 일 것입니다 ,하지만 일찍 할당 해제되는 다른 변수가 있습니다 (아마도 경로).

희망이 도움이됩니다. 나는이 페이지의 다른 대답이 나를 위해 일한다는 것을 알고있다.