비동기 삭제 작업에 GCD/NSOperationQueue를 사용하고 있습니다. 메인 쓰레드로 돌아에 EXC_BAD_ACCESS의 코드 조각 결과의GCD/NSOperationQueue EXC_BAD_ACCESS
- (void)deleteWithCompletionHandler:(Handler)completionHandler
{
dispatch_queue_t queue = dispatch_queue_create("My Queue", NULL);
dispatch_async(queue, ^{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
if ([fileManager fileExistsAtPath:self.path]) {
BOOL success = [fileManager removeItemAtPath:self.path error:&error];
}
dispatch_async(dispatch_get_main_queue(), ^{
if (completionHandler) {
completionHandler(error, nil);
}
});
});
}
모두 :
- (void)deleteWithCompletionHandler:(Handler)completionHandler
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
if ([fileManager fileExistsAtPath:self.path]) {
BOOL success = [fileManager removeItemAtPath:self.path error:&error];
}
NSOperationQueue *main = [NSOperationQueue mainQueue];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
if (completionHandler) {
completionHandler(error, nil);
}
}];
}];
}
다음과 같은 :
나는 다음과 같은 실행 코드가 있습니다.
내가 뭘 잘못하고 있니? 프로젝트의 일부 코드는 ARC를 사용하지 않습니다.
감사합니다.
내가 얻은 것은 모두 EXC_BAD_ACCESS이며 충돌 보고서가 생성되지 않습니다. ARC없이이 코드를 실행하는 코드 스 니펫을 제공 할 수 있습니까? @autoreleasepool {}에 모두 넣으면 트릭을 할 수 있습니까? – Raz
아니, 그걸 고치는 방법이 아니야. 앞서 언급했듯이 오류를 nil로 초기화하고 전역 동시 대기열을 사용해야합니다. EXC_BAD_ACCESS는 예외 포트 (예 : 프로세스에 연결된 lldb)를 수신하는 것이 아닌 한 항상 크래시 로그를 트리거해야합니다. lldb를 사용하는 경우 적어도 백 트레이스를 제공 할 수 있습니까? –
알았어요, 알았어요. 감사. 그것을 만든! – Raz