우리는 최근에 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++로 이동됩니다 (이 자체 대답 질문) 그래서 낮은 수준을 유지하고 싶었어요.
'dispatch_async'에서 수행중인 작업의 예를 보여줄 수 있습니까? – Oskar
@Oskar 코드 추가 –