나는 메모리가 부족하여 약 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의 메모리를 해제하는 것 같습니다. 수동으로 해제 할 수있는 방법이 있습니까? 아니면 제가 놓친 다른 것이 있습니까? 극도로 좌절감을 느끼고, 어떤 도움을 환영합니다.
한눈에보기 어렵지만 이벤트 (개체가 *** 대상 인 ***이 고전적인 원인입니다. –
한 가지 가능한 솔루션은 이전에 삭제 된보기 컨트롤러 개체를 저장하고 다시 사용하는 것입니다. 테이블보기 셀 – hotpaw2
그것은 가능한 해결책 일뿐만 아니라 아마도 더 나은 해결책이기도합니다 .UITableView는 셀을 할당/해제하지 않고 다시 사용하는 이유가 있습니다. 후자는 훨씬 효율적입니다. – lxt