1

우리는 최근에 dispatch_async을 대부분의 장소에서 사용하기 위해 (NSOperation 대 ​​dispatch_async에 대해 많은 내용을 읽은 후) * 스레딩 메커니즘을 개정했습니다. 그런 다음 코드의 여러 부분에서 항상 EXC_BAD_ACCESS를 사용하여 코드가 깨졌습니다. 항상 명확한 패턴이없이 dispatch_async(queue,...) 부분에 있습니다. 일반적으로 20 분 ~ 2 시간 후에 발생합니다. 다음과 같이 dispatch_async를 사용할 때 EXC_BAD_ACCESS

우리 dispatch_async 블록

는 청취자에게 통지하기 위해서 사용보고되었다 :

NSMutableSet *_listeners; // Initialised elsewhere and filled with interested listeners 
 
void(^block)(id listener); // Block to execute 
 

 
@synchronized(_listeners) { 
 
    for (id listener in _listeners) { 
 
    dispatch_async_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // We used different queues for different listeners, but showing only one type of queue here for brevity 
 
    dispatch_async(queue, ^{ // CRASHING LINE 
 
     block(listener); 
 
    }); 
 
    } 
 
}

Y 흔한 증상이었다 :

  • 는 iOS10에서 발생 결코 iOS8의
  • 에 변화가 없습니다
  • 디버깅 중에 발생하지만 결코보고하지 않음 n 개의 생산

우리는 dispatch_async의 단순함을 좋아 *

, NSOperationQueue 년대의 차단/종속 기능이 필요하지 않았고 우리가 곧 C++로 이동됩니다 (이 자체 대답 질문) 그래서 낮은 수준을 유지하고 싶었어요.

+0

'dispatch_async'에서 수행중인 작업의 예를 보여줄 수 있습니까? – Oskar

+0

@Oskar 코드 추가 –

답변

4
디버깅 일 후

, 우리의 스레드 객체가 강하게 유지하고 보장 및 악기를 사용하여 다양한 약한 강한 조합과 철저한 프로파일 링을 시도, 우리는이 (또한 reported here로) 애플 버그입니다 있다는 결론에 도달 한 그 최근 iOS 버전에만 표시됩니다 (iOS10,하지만 libBacktraceRecording.dylib이 나타나기 시작하면 버전에서 제공 될 것입니다). 의

증상 : iOS8.x

    • 재현하지 만 나타낼 수있는 패턴

    하지 않고, 디버깅 모드로 할 때 코드의 임의의 부분에서

  • EXC_BAD_ACCESS를 발생 이.

    희망이 다른 사람에게 유용합니다!

  • +0

    이것은 매우 유용합니다. 감사합니다. 무슨 일이 일어나는지 알아 내려고 내 머리카락을 꺼내서 내 코드가 손상되지 않았 음을 알았습니다. –