2017-12-01 3 views
0

엑스 코드 9.1 iPhoneX 시뮬레이터를 스 와이프 제스처 인식기를 사용하여 iPhone6 ​​11.1.2충돌은 사용자 정의 컨테이너보기 컨트롤러

나는 일이 될 것으로 보인다 때문에 (메모리 손상에 명시 보인다 충돌을 추적하려고 낭비 다른 때마다).

스 와이프 제스처 인식기가있는 (단순한) 컨테이너보기 컨트롤러를 사용하도록 범위를 좁혔습니다.

enter image description here

당신은 탐색 표시 줄에있는 두 개의 왼쪽, 오른쪽으로 스 와이프 제스처 인식 자 또한 두 (이전 및 다음) 버튼을 볼 수 있습니다. UIViewController에는 간단한 UILabel이 있습니다. 전환 한 후, 또는 컨테이너 뷰로부터 멀리 이동 후 중/발생

private func addViewToLayout(view: UIView) { 
    let views = ["view": view] 

    view.translatesAutoresizingMaskIntoConstraints = false 
    container.addSubview(view) 

    container.addConstraints(
     NSLayoutConstraint.constraints(withVisualFormat: "V:|[view]|", 
     options:NSLayoutFormatOptions.alignAllLeft, metrics:nil, views:views)) 
    container.addConstraints(
     NSLayoutConstraint.constraints(withVisualFormat: "H:|[view]|", 
     options:NSLayoutFormatOptions.alignAllLeft, metrics:nil, views:views)) 
    } 

    private func transition(direction: Direction = .left) { 
    let controllerPrevious = childViewControllers.first 

    if let controllerNext = storyboard?.instantiateViewController(
     withIdentifier: "Test") { 
     addChildViewController(controllerNext) 
     addViewToLayout(view: controllerNext.view) 

     if let controllerPrevious = controllerPrevious { 
     controllerNext.view.transform = startTransform(direction: direction) 

     UIView.animate(withDuration: transitionDuration, 
      animations: { 
       controllerNext.view.transform = CGAffineTransform.identity 
       controllerPrevious.view.transform = 
        self.endTransform(direction: direction) 
      }, 
      completion: { (finished: Bool) in 
       controllerPrevious.view.removeFromSuperview() 
       controllerPrevious.removeFromParentViewController() 
       controllerNext.didMove(toParentViewController: self) 
      }) 
     } 
    } 
    } 

충돌 :

enter image description here

전환에 의해 수행된다 :로

제스처 인식기

구성되고 제어 장치. 디버거는 일반적으로 중요한 스택 추적없이 주 스레드에서 종료됩니다.

enter image description here

충돌의 원인이 쉬운 상대, 그러나 항상 예를 ​​들어, 같은 동작에서 발생하지 않습니다 (장치에서 실행하여 얻을 로그) : 탐색 바에서 버튼 만 사용하는 경우

EXC_BAD_ACCESS (SIGSEGV) 
KERN_INVALID_ADDRESS at 0x4054600000000000 
Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libobjc.A.dylib     0x0000000180f68428 objc_msgSend + 8 
1 UIKit       0x000000018b40dda4 -[UIView _layoutConstraintCleanup] + 204 

또는

EXC_CRASH (SIGABRT) 
0x0000000000000000, 0x0000000000000000 
EXC_CORPSE_NOTIFY 
Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x000000018181d348 __pthread_kill + 8 
1 libsystem_pthread.dylib   0x0000000181931344 pthread_kill$VARIANT$mp + 396 
2 libsystem_c.dylib    0x000000018178cfb8 abort + 140 
3 libsystem_malloc.dylib   0x0000000181863a08 nanozone_default_reader + 0 

참고 충돌 발생하지 않습니다.

충돌의 원인을 찾아내는 데 도움이 될만한 것이 있습니까?

전환 후 현재 자식보기 컨트롤러를 해제 할 때 제스처 인식기를 사용하지 않아도됩니까?

question에는 유사한 증상이있는 것으로 보이지만 실제로 유용한 제안은 없습니다.

편집 : 나는 Dropbox에 충돌을 전시하는 프로젝트를 업로드 한

. 프로젝트를 컴파일하고 실행 한 후 다음을 살짝 두 번 누르고 왼쪽 및 오른쪽으로 두 번 터치 한 다음 뒤로를 살짝 누르고 다음을 클릭 한 다음 충돌이 발생할 때까지 반복하십시오. 때로는 충돌이 즉각적이며 때로는 20 개 이상의 조치가 필요할 수 있습니다.

+0

전환 완료 블록에서 해당 부분을 제거하고 충돌이 계속 발생하는지 확인할 수 있습니까? 당신이 경쟁 조건에 부딪치고있는 것처럼 느껴지기 때문에 오류가 일치하지 않는 것입니다. (내 dev에 맥 또는 아이디 테스트에 더) – solenoid

+0

단지 참조를 위해, 애플 리케이션은 사용자 정의 애니메이션 전환을 할 수있는 방법이 제공됩니다 https://developer.apple.com/documentation/uikit/uiviewcontrollertransitioningdelegate/1622037-animationcontroller – solenoid

+0

@ 솔레노이드 'removeFromParentViewController', 그리고'didMove'도 제거하려고했습니다. 여전히 충돌이 발생했습니다. – Matt

답변

0

제공하신 제한된 데이터로 인해 메모리를 더 많이 사용하는 것처럼 보입니다.

이러한 문제를 디버깅하고 해당 조사 결과를 제공하려면 Xcode에서 제공하는 도구를 사용해야합니다. 프로젝트의 정적 분석을 사용하십시오. ASan, NSZombies, GuardMalloc 등에서 실행하십시오.

이러한 조사 결과가 더 많으면 다음 단계를 쉽게 찾을 수 있습니다.

+0

나는 모든 경고 (""- 모든 것 ""), 분석, 살균제, 좀비, GuardMalloc을 켰습니다. 전혀 결과가 없습니다. 제스처 인식기와 컨테이너보기에서 추가 및 제거 된 뷰/컨트롤러 간의 상호 작용은 "메모리 스매셔"라고 생각합니다. – Matt

+0

나는 Instruments를 사용해 보았지만, 내가 무엇을하고 있는지 모른다. 아무것도 명백한 것이 관찰되지 않았다. 충돌을 관찰하기 위해 실행할 수있는 프로젝트의 주 질문에서 편집을 참조하십시오. – Matt

0

이것은 간단 할 수도 있지만 Interface Builder와 2 개의 손가락을 문지르는 문제가 있습니다. 1 개의 손가락을 지정하면 잘 동작하지만 2 개의 손가락에는 충돌이 발생합니다.

IB에서 1 ​​손가락으로두고 viewDidLoad에서 2 손가락으로 변경하면 문제가 사라집니다.

관련 문제