문제

이건 정말 이상 해요 ...

나는 내 앱을 실행하고 그것이 열리고보기가 구축되는 동안 나는 다음을 얻는다.

Collection <CALayerArray: 0x124650> was mutated while being enumerated.

코드 추적은 다음과 같습니다.

main
UIApplicationMain
-[UIApplication _run]
CFRunLoopRunInMode
CFRunLoopRunSpecific
_UIApplicationHandleEvent
-[UIApplication sendEvent:]
-[UIApplication handleEvent:withNewEvent:]
-[UIApplication _runWithURL:sourceBundleID:]
-[UIApplication _performInitilizationWithURL:sourceBundleID:]
-[AppDelegate applicationDidFinishLaunching:]
+[Controller initializeController] //This is my own function
    [window addSubview: pauseMenuController.view] //This is the last point of my code it goes through
-[UIView(Hierarchy) addSubview:]
-[UIView(Internal) _addSubview:positioned:relativeTo:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]
_NSFastEnumerationMutationHandler
objc_exception_throw

나는 게임을 많이 실행하고 많은 시간을 보냈고 나는 이것을 본 적이없고 갑자기 그것이 나타났습니다. 이상한 점은 내가 다른 스레드를 만들지 않는다는 것입니다. ~ 후에 이 코드는 모두 호출됩니다. UIVIEW에서 액세스하는 동안 수정 될 수있는 내용에 대한 설명을 할 수 있다면 누군가가 이것을 디버깅하는 것이 더 쉬울 것입니다. 이미 무언가를 추가하는 동안보기에 무언가를 추가하는 것과 관련이 있습니까? 어떤 아이디어?

도움이 되었습니까?

해결책

동시 예외가 아닙니다. 열거 돌연변이 예외는 (아마도 같은 스레드의 루프 내부) 무언가가 반복되는 배열/세트/사전을 변경할 때 발생합니다.

AddSubview : Stack에 있기 때문에, 제 생각에는 건설 중에 Uiview의 하위 뷰 중 하나를 제거하려고하는 것이 내 생각입니다.

실행중인 방법을 무시하고 있습니까? AddSubview 또는 LayoutSubviews와 같이? 이 중 하나라도 하위 뷰를 제거하면 문제가 발생합니다.

다른 팁

당신의보기에 대의원을 배정 한 뷰가있을 수 있습니까? 이것은 일반적으로 전화 할 때보기가 무한히 (스택 제한에 도달 할 때까지)를 다시 반복하게합니다. _makeSubtreePerformSelector:withObject:withObject:copySublayers:, 그러나 여기서 바로하려는 모든 일에 돌연변이가 포함될 가능성이 있다고 생각합니다.

이것이 그 이유는 Uiview가 Calayer의 대의원이 uiview라면 Calayer가 Uiview에 속하고 Uiview가 계층의 일부라고 가정하기 때문입니다. 그러나 자신의 Calayer를 만들고 대의원을 uiview로 할당하면 uiview는 재귀의 일부로 스스로를 호출하게됩니다.

문서에서 :

열거는 "안전하다" - 열거 자에는 돌연변이 가드가있어 열거 중에 수집을 수정하려고하면 예외가 제기됩니다.

기본적으로 이것은 Objective-C 2.0에 도입 된 빠른 열거를 사용하여 열거하는 동안 컬렉션에 객체를 추가/제거 할 수 없음을 의미합니다. 그렇게하면 돌연변이 가드가 유효하게 만들어집니다.

귀하의 경우, 컬렉션은 View 계층 구조와 관련이 있습니다. 이 특정 컬렉션에 뷰를 추가 및/또는 제거하려면 빠른 열거를 사용하지 마십시오.

Calayer의 -dealloc 방법 중에 속성을 정리하려고 할 때 Calayers 내에서 이런 일이 발생하는 것을 보았습니다. 당신은 당신이 같은 견해의 -dealloc 동안 당신의 견해 중 하나의 속성을 바꾸는 일을 어떻게 든하고 있는지 확인하고 볼 수 있습니다.

나는 같은 버그에 부딪쳤다. 비 메인 스레드에서 View Hierarchy를 변동시키고있었습니다. 보기에 대한 모든 수정이 기본 스레드에서 수행되는지 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top