2016-09-19 4 views
1

Xcode 8 및 Swift 2.3에서 할당 도구로 이상한 동작이 나타납니다. 나는 deinit이 호출되고있는 객체 (A)를 가지고 있지만, 참조가 할당 해제되는 객체 중 하나를 제외하고 모두 (내가 말할 수있는 한 별도의 메모리 문제는 아니지만) 객체가 계속됩니다. 할당 도구에 "실시간"으로 표시되고 영구적으로 표시됩니다. 나는 그것을 유지하고있어 디버깅하려고 할 때 또한, 내가 보는 모두는 다음과 같습니다Deinit은 호출하지만 객체는 여전히 메모리에 저장됩니다.

  • 가 deinit 방법에 인쇄 라인을 추가 : 나는 deinit을 확인했습니다

    enter image description here

    주에 의해 실행되고있다

  • 참조가 할당 해제되고 다른 객체를 검증 deinit 방법
  • 에 브레이크 포인트를 추가
  • , 그들은 A.__deallocating_deinit를 내부 발생 주장 이형 (-1) REF 카운트 나타날 방법

그러나 몇 가지 알려지지 않은 이유로 인해 달라 붙는 것처럼 보입니다.

+0

확실한 이유는 무엇입니까? ARC에 따라 객체는 참조 카운트가 0이 될 때까지 할당이 취소되지 않습니다. 그래서 다른 뷰 (다른 VC에서)에 대한 뷰의 참조를 유지할 수 있습니다. – Janmenjaya

+1

deinit가 호출되면 (반환 된) 객체가 거의 확실하게 사라집니다. 일반적으로 이런 종류의 문제가 발생하면 예상하지 못한 개체의 사본이 두 번째 있습니다. ("기대하지 않았던 두 번째 사본이 있습니다"는 실제로는 불가능할 것으로 보이는 다양한 행동의 원인입니다.) 메모리 주소를 확인하십시오. 하지만 내가 찾던 또 하나의 것은 당신이 우연히 객체를 deinit에 유지하고 있는지 여부입니다. 그걸로 당신을 혼란에 빠지게 할 수 있습니다. (하지만 아직도 * 아마도이 증상을 일으키지 않을 것입니다; 나는 여분의 복사본을 베팅합니다). –

+0

@RobNapier 실제로 하나의 개체 만 생성된다는 것을 확인했습니다. 'deinit'이 처형 당했고 아직 그 객체를 해제하지 않았습니다. 나는 아직도이 문제가 발생한 이유를 100 % 알지 못하지만, 결국 아래의 답을 추가하여 결국 문제를 해결했습니다. –

답변

1

검색을 몇 시간 더 마침내 (대부분) 알아낼 수있었습니다.

이 경우, 6 개의 속성을 가진 클래스 A가 있는데 그 중 하나는 B 클래스의 인스턴스입니다. 클래스 A는 클래스 B의 블록 콜백을 등록합니다. 클래스 B는 기본 실행 루프 바깥 쪽에서 이벤트를받습니다. @autoreleasepool에서 제대로 포장되지 않은 NSThread를 분리합니다. 결과적으로 클래스 B가 의도 한 것보다 오래 유지되어 A에 대한 콜백이 의도 한 것보다 오래 유지되는 결과를 초래했습니다.

클래스 A가 모든 블록을 [unowned self]으로 등록했기 때문에 "대부분"이라고 생각하는 이유가 있습니다. 여전히 알려지지 않은 이유 때문에, deinit을 실행하기에 충분할 것으로 보였지만 실제로는 객체를 해제 할만큼 충분하지 않았습니다. @autoreleasepool의 다른 스레드를 래핑하면 앱이 B를 풀어서 A를 해제 할 수있게되었습니다.

+0

이 대답을 바탕으로 누군가가이 문제를 실제로 해결하는 "최상의"솔루션을 식별 할 수 있는지 확인하기 위해이 답을 선택하지 않은 채로 두겠습니다. –