1

비동기 삭제 작업에 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를 사용하지 않습니다.

감사합니다.

답변

1

ARC를 사용하지 않으므로 스택 변수는 0/nil로 초기화되지 않습니다. 따라서 error에 대한 임의 스택 쓰레기와 함께 completionHandler(error, nil);이 호출됩니다.

이것은 코드를 살펴볼 때 가장 두드러진 문제점이었습니다. clang 정적 분석기는이를 쉽게 파악해야합니다. 분석기를 코드에서 실행하고 모든 경고를 살펴 보시기 바랍니다.

다른 문제가 숨어있을 수 있으므로 도움이 더 필요하면 충돌 보고서를 제공해주세요.

또한 큐 변수가 범위를 벗어나 MRR의 경우 누출되거나 ARC의 경우 사용 중일 때 해제됩니다. 당신은 아마도 전역 동시 큐를 사용해야 만합니다.

+0

내가 얻은 것은 모두 EXC_BAD_ACCESS이며 충돌 보고서가 생성되지 않습니다. ARC없이이 코드를 실행하는 코드 스 니펫을 제공 할 수 있습니까? @autoreleasepool {}에 모두 넣으면 트릭을 할 수 있습니까? – Raz

+0

아니, 그걸 고치는 방법이 아니야. 앞서 언급했듯이 오류를 nil로 초기화하고 전역 동시 대기열을 사용해야합니다. EXC_BAD_ACCESS는 예외 포트 (예 : 프로세스에 연결된 lldb)를 수신하는 것이 아닌 한 항상 크래시 로그를 트리거해야합니다. lldb를 사용하는 경우 적어도 백 트레이스를 제공 할 수 있습니까? –

+0

알았어요, 알았어요. 감사. 그것을 만든! – Raz