1

Monotouch.Dialog 인스턴스를 배치하는 경우 :프로필 - 모노 - 다른 루트 역 참조

맞춤 UIBubbleMapElement 요소는 GC에 의해 배치
  • ;
  • 각 배치 된 요소에 대해 사용자 정의 UIBubbleMapCell도 GC에 의해 처리됩니다.
  • 그러나 모든 폐기 된 셀에 대해서는 사용자 정의 UIBubbleMapView이 처리되지 않습니다.

이 문제를 해결하기 위해 Mono Profiler 응용 프로그램을 사용하기 시작했습니다.

Mono profiler showing only a root reference.

질문 : 삭제 된되지 UIBubbleMapView 인스턴스 역 참조 화상 찾고. 이 마지막 참조를 어떻게 풀어 내 사용자 정의보기를 수집 할 수 있습니까?

마지막으로,이 내 UIBubbleMapCell 처분 방법입니다 :

protected override void Dispose (bool disposing) { 

    bubbleMapView = null; 

    System.Diagnostics.Debug.WriteLine ("############# {0} 'Dispose' {1}.", this, disposing ? "invoked directly" : "called by the garbage collector finalizer"); 

    base.Dispose (disposing); 
} 

그리고 이것은 내가 콘솔에 인쇄있어 무엇 :

############# <UIBubblesViewController: 0x152427c0> 'Dispose' called by the garbage collector finalizer. 
############# <UIBubbleMapCell: 0x152b6a40; baseClass = UITableViewCell; frame = (0 195; 320 38); autoresize = W; layer = <CALayer: 0x152c65c0>> 'Dispose' called by the garbage collector finalizer. 
############# <UIBubbleMapCell: 0x1524aba0; baseClass = UITableViewCell; frame = (0 35; 320 38); autoresize = W; layer = <CALayer: 0x152038f0>> 'Dispose' called by the garbage collector finalizer. 
############# <UIBubbleMapCell: 0x17c91710; baseClass = UITableViewCell; frame = (0 233; 320 116); autoresize = W; layer = <CALayer: 0x152cbb80>> 'Dispose' called by the garbage collector finalizer. 
############# <UIBubbleMapCell: 0x1520b2c0; baseClass = UITableViewCell; frame = (0 108; 320 52); autoresize = W; layer = <CALayer: 0x17c2fc30>> 'Dispose' called by the garbage collector finalizer. 

편집 : 감사합니다 롤프 당신의 대답.

첫째,이있는 UITableViewCell 폐기 방법에 다음 코드를 추가 :

bubbleMapView.Dispose(); 
bubbleMapView = null; 

을 콘솔 내부에 다음 메시지를 수신하지만, 수집되지로서 여전히 객체를 제공하고 모노 프로파일 러. 이전과 같은 이미지.

############# <UIBubbleMapView: 0x154af370; frame = (0 0; 1 1); layer = <CALayer: 0x154af0e0>> 'Dispose' invoked directly. 

intruments 앱에서 실행될 때 참조 횟수가 1보다 큰 것을 볼 수 있습니다.

Visible memory leak.

이미지에서 UIBubbleTextView 인스턴스가 있지만 UIBubbleMapView 경우와 같은 방법으로 정확하게 동작합니다.

UIBubbleMapView에는 다른보기가 있습니다. 이것은 역 참조가 확인되지 않을 때의 프로파일 러 정보입니다. 이러한 종류의 하위 뷰를 처리 할 트릭이 있습니까?

No inverse references

답변

3

<Other Root>는 GCHandle Xamarin.iOS가 해당 기본 객체가 해제 될 때까지 살아 관리 객체를 유지하기 위해 내부적으로 사용하는 보통이다. 이 링크를 깨는 한 가지 방법은 객체에 Dispose를 호출하는 것입니다 (UIBubbleMapView에서 Dispose를 호출하는 것을 언급하지 않음).이 경우 관리 객체는 GC에 의해 수집됩니다 (물론 다른 관리되는 코드에서 참조하지 않는 한).

이 UIBubbleMapView 인스턴스에 대한 참조를 보유하고있는 다른 원시 코드가있을 가능성이 있지만 인벤토리에서 Allocation instrument를 사용하여 프로파일 링해야합니다 (ref count 추적을 통해 정확히 어떤 코드가 추적되는지 확인해야 함). 개체를 유지함).

업데이트

관리되는 개체에 대한 폐기를 호출 할 때까지, 관리 객체는 기본 객체를 유지합니다 [1]. 즉, 보유 개수가 1보다 크면 해당 객체에 대한 추가 원시 보유가 있음을 의미합니다 (객체에 대해 Dispose를 호출하면 남아있는 참조가 모두 원시 임). 이 시점에서 관리 객체가 GC에 의해 수집 될 수 있으므로 더 이상 HeapShot을 사용하여 원시 객체를 추적 할 수 없으므로 Instruments를 사용해야합니다.

힌트 : 인스트루먼트에서 오른쪽 사이드 바를 활성화하면 각 유지/릴리스 호출의 스택 추적을 얻게됩니다. 이는 객체를 보유한 사람을 추적하는 데 매우 유용합니다.

[1] Xamarin.iOS는 보유 개수가 하나가되면 관리 객체가 참조를 해제하고 GC는 관리 객체가 다른 관리되는 코드에서 참조되지 않는다고 결정합니다.