2011-03-13 2 views
1

나는 메모리가 부족하여 약 30 개의 VC가 응용 프로그램이 충돌 한 후에 무한한 양의 ViewController를 표시하고 각각의 새로운 애니메이션에 애니메이션을 적용하는 응용 프로그램을 보유하고 있습니다. 추가 실험을 한 후 ViewController 인스턴스의 소멸자가 호출되지 않는다는 것을 발견했습니다.모노 터치 가비지 수집 기능이 작동하지 않음 - 버그?

~TargetPromptController(){ 
    Console.WriteLine("Destructor Called!"); 
} 

코드는 새로운 VC로 전환하기 :

public void PageFlipRight(UIViewController aController) { 

     aController.View.Frame = new System.Drawing.RectangleF(0, 0, 659, 630); 
     aController.ViewWillAppear(true); 
     if (activeRightController != null) activeRightController.ViewWillDisappear(true); 
     rightView.AddSubview(aController.View); 
     if (aController.View is BaseRightView) 
      ((BaseRightView)aController.View).SetLocation(new PointF(0, 0),       CurrentOrientation); 
     aController.ViewDidAppear(true); 

     UIView.BeginAnimations(null); 
     UIView.SetAnimationDuration(1.0); 
     UIView.SetAnimationTransition(UIViewAnimationTransition.CurlUp, rightView, true); 
     UIView.CommitAnimations(); 

     NSTimer.CreateScheduledTimer(new TimeSpan(0, 0, 0, 0, 500), 
      delegate { 
        if (activeRightController != null) { 
         activeRightController.View.RemoveFromSuperview(); 
         activeRightController.ViewDidDisappear(true); 
         activeRightController.Dispose(); 
        } 
        activeRightController = aController; 
        GC.Collect(); 
       }); 
} 

내가 시도 다. GC.Collect() 수동 호출, 모든 하위 뷰에 수동으로 Dispose() 호출, 하위 뷰 제거, 이벤트 핸들러 등록 취소 ... 아무것도 VC의 메모리를 해제하는 것 같습니다. 수동으로 해제 할 수있는 방법이 있습니까? 아니면 제가 놓친 다른 것이 있습니까? 극도로 좌절감을 느끼고, 어떤 도움을 환영합니다.

+2

한눈에보기 어렵지만 이벤트 (개체가 *** 대상 인 ***이 고전적인 원인입니다. –

+1

한 가지 가능한 솔루션은 이전에 삭제 된보기 컨트롤러 개체를 저장하고 다시 사용하는 것입니다. 테이블보기 셀 – hotpaw2

+0

그것은 가능한 해결책 일뿐만 아니라 아마도 더 나은 해결책이기도합니다 .UITableView는 셀을 할당/해제하지 않고 다시 사용하는 이유가 있습니다. 후자는 훨씬 효율적입니다. – lxt

답변

3

당신의 코드가 그 조각으로 무엇을하고 있는지 말해 어렵지만,라고하지 않을 당신의 종결 자이 두 가지 이유에 의한 경우 : 당신이 폐기를 호출 할 때

의 (a)()는 수동으로, 이것은을 을 출시 그런 다음 GC.SupressFinalize (표준 Dispose 패턴)를 호출합니다. 이렇게하면 파이널 라이저가 실행되지 않으므로 본 적이 없습니다.

(b) 누군가가 여전히 그것에 대한 참조를 가지고 있기 때문에 Dispose를 꺼내더라도 이런 일이 발생하지 않는 경우입니다.

이제 UIViewController를 애니메이션화하는 것이 아니라 뷰를 애니메이션화하는 것이 좋습니다. UIViewController의 배후에있는 것처럼 보이는 것은 불쾌 해 보입니다. 그러면 코드에 여러 뷰를 관리하는 AnimatedUIViewController가 있습니다.

0

컨트롤러에 DidReceiveMemoryWarning 메서드가 호출되는지 확인하십시오. 그렇다면 현재 볼 수없는보기의 일부 메모리를 해제해야합니다.