C# xamarin视图控制器中的uiimage导致内存泄漏

C# xamarin视图控制器中的uiimage导致内存泄漏,c#,memory-leaks,xamarin.ios,xamarin,C#,Memory Leaks,Xamarin.ios,Xamarin,我有一个函数,它在循环中多次被调用,并返回一个视图控制器(每个视图控制器就像演示文稿的幻灯片)。Uiviewcontroller具有滚动视图、uiwebview和uiimageview等子视图。随着视图控制器数量的增加,我会收到内存警告和应用程序崩溃。我已经将函数包装在nsautorelease池中,我正在使用“使用”块来处理uiimages,但没有使用 你能看一下代码,告诉我什么地方出了问题,以及如何解决内存问题吗 public UIViewController获取页面(int i){ 使用(

我有一个函数,它在循环中多次被调用,并返回一个视图控制器(每个视图控制器就像演示文稿的幻灯片)。Uiviewcontroller具有滚动视图、uiwebview和uiimageview等子视图。随着视图控制器数量的增加,我会收到内存警告和应用程序崩溃。我已经将函数包装在nsautorelease池中,我正在使用“使用”块来处理uiimages,但没有使用

你能看一下代码,告诉我什么地方出了问题,以及如何解决内存问题吗

public UIViewController获取页面(int i){
使用(var-pool=new-NSAutoreleasePool()){
UIViewController c=新的UIViewController();
c、 View.Frame=新矩形f(0,0,1024,743);
UIScrollView scr=新的UIScrollView(新的矩形f(0,0,1024,743));
scr.ContentSize=newsizef(1024748);
string contentDirectoryPath=//路径字符串
UIWebView资产=新UIWebView(新矩形F(0,0,1024,748));
asset.ScalesPageToFit=true;
UIScrollView scrl=新的UIScrollView(新的矩形f(0,0,1024,748));
scrl.ContentSize=newsizef(1024768);
使用(UIImageView imgView=新的UIImageView(新的矩形F(0,0,1024,748))){
使用(var img=UIImage.FromFile(contentDirectoryPath)){
imgView.Image=img;
Dispose();
}
//UIImage img=UIImage.FromFile(contentDirectoryPath);
//imgView.Image=img;
imgView.ContentMode=UIViewContentMode.ScaleSpectFit;
浮动宽度比率=imgView.Bounds.Size.Width/imgView.Image.Size.Width;
浮动高度比=imgView.Bounds.Size.Height/imgView.Image.Size.Height;
浮动比例=数学最小值(宽高比);
浮动图像宽度=比例*imgView.Image.Size.Width;
浮动图像高度=比例*imgView.Image.Size.Height;
imgView.Frame=新矩形F(0,0,imageWidth,imageHeight);
scrl.AddSubview(imgView);
imgView.Center=imgView.Superview.Center;
Dispose();
}
asset.AddSubview(scrl);
scrl.Center=scrl.Superview.Center;
asset.ScalesPageToFit=true;
scr.AddSubview(资产);
c、 View.AddSubview(scr);
scr.Center=scr.Superview.Center;
返回c;
}

使用
NSAutoReleasePool
对您没有帮助,处理图像或图像视图也不会对您有帮助(事实上,您的代码会处理您正在添加到
UIScrollView
UIImageView
——我真的想知道为什么这样做会起作用)

如果您正在创建大量承载大量子视图(尤其是大型图像)的
UIViewController
实例,那么只要从某个地方引用这些控制器,最终就会耗尽内存

据我所见,您的图像是1024x768,可能是32位的颜色深度,即内存中每个图像3兆字节


您必须删除正在创建的视图控制器,或使其更智能(例如,在
viewwillappease()
viewwillappease()
中加载和处理图像)

问题是,为什么要创建具有相同视图(不同内容)的多个视图控制器?为什么不创建一个视图控制器,然后在ViewDidLoad()上更改它的内容?我看不到您在任何地方使用传递的整数,所以这是您的实际代码还是只是您正在做的工作的示例

如果要在不重新加载的情况下更改控制器的内容,请创建一个函数来更改值。例如:

public void绑定(UIImage)
{
this.imgView.Image=图像;
}