Xamarin.iOS-内存泄漏问题UIImage/UIImageView
我已经在我的应用程序中添加了控制器,它可以使用UISlider调整图像亮度和对比度。当我多次移动滑块时,我的应用程序崩溃,我认为这会导致内存泄漏,但我无法找到它发生的位置以及如何修复,因为我以前从未这样做过Xamarin.iOS-内存泄漏问题UIImage/UIImageView,xamarin.ios,Xamarin.ios,我已经在我的应用程序中添加了控制器,它可以使用UISlider调整图像亮度和对比度。当我多次移动滑块时,我的应用程序崩溃,我认为这会导致内存泄漏,但我无法找到它发生的位置以及如何修复,因为我以前从未这样做过 public abstract class FilteringDemoDelegate { public abstract void ImageViewControllerDidFinish(UIImage filteredImage); } public class ImageView
public abstract class FilteringDemoDelegate
{
public abstract void ImageViewControllerDidFinish(UIImage filteredImage);
}
public class ImageViewController : UIViewController
{
UIImage sourceImage, displayImage, resultImage;
public FilteringDemoDelegate filteringDelegate;
UIButton saveButton, resetButton;
UIImageView imageView;
UISlider sliderC, sliderB;
UILabel labelC, labelB;
public ImageViewController(UIImage image)
{
sourceImage = image;
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
Title = "Settings";
View.BackgroundColor = UIColor.White;
resetButton = UIButton.FromType(UIButtonType.RoundedRect);
resetButton.Frame = new CGRect(110, 40, 90, 40);
resetButton.SetTitle("Reset", UIControlState.Normal);
resetButton.SetTitleColor(UIColor.FromRGB(11, 132, 66), UIControlState.Normal);
resetButton.TouchUpInside += (sender, e) => {
sliderB.Value = 0;
sliderC.Value = 1;
HandleValueChanged(sender, e);
};
View.Add(resetButton);
saveButton = UIButton.FromType(UIButtonType.RoundedRect);
saveButton.Frame = new CGRect(210, 40, 90, 40);
saveButton.SetTitle("Save", UIControlState.Normal);
saveButton.SetTitleColor(UIColor.FromRGB(11, 132, 66), UIControlState.Normal);
saveButton.TouchUpInside += (sender, e) => {
if (resultImage != null)
{
ImageEditingViewController(resultImage);
}
else
{
ImageEditingViewController(sourceImage);
}
};
View.Add(saveButton);
labelC = new UILabel(new CGRect(10, 100, 90, 20));
labelB = new UILabel(new CGRect(10, 140, 90, 20));
labelC.Text = "Contrast";
labelB.Text = "Brightness";
View.Add(labelC);
View.Add(labelB);
sliderC = new UISlider(new CGRect(100, 100, 210, 20));
sliderB = new UISlider(new CGRect(100, 140, 210, 20));
sliderC.MinValue = 0;
sliderC.MaxValue = 4;
sliderC.Value = 1;
sliderB.MinValue = -1;
sliderB.MaxValue = 1;
sliderB.Value = 0;
// update the image in 'real time' as the sliders are moved
sliderC.ValueChanged += HandleValueChanged;
sliderB.ValueChanged += HandleValueChanged;
View.Add(sliderC);
View.Add(sliderB);
imageView = new UIImageView(new CGRect(10, 200, View.Bounds.Width - 20, View.Bounds.Height - 200));
displayImage = sourceImage;
imageView.Image = displayImage;
View.Add(imageView);
}
void HandleValueChanged(object sender, EventArgs e)
{ // use the low-res version
imageView.Image = AdjustImage(displayImage);
if (resultImage != null)
{
resultImage.Dispose();
}
resultImage = imageView.Image;
}
CIContext context;
CIColorControls colorCtrls; //CIFilter
UIImage AdjustImage(UIImage image)
{
if (colorCtrls == null)
colorCtrls = new CIColorControls() { Image = CIImage.FromCGImage(image.CGImage) };
else
colorCtrls.Image = CIImage.FromCGImage(image.CGImage);
if (context == null)
context = CIContext.FromOptions(null);
colorCtrls.Contrast = (float)Math.Round(sliderC.Value, 1);
colorCtrls.Brightness = (float)Math.Round(sliderB.Value, 1);
using (var outputImage = colorCtrls.OutputImage)
{
var result = context.CreateCGImage(outputImage, outputImage.Extent);
return UIImage.FromImage(result);
}
}
public void ImageEditingViewController(UIImage filteredImage)
{
if (filteringDelegate != null)
{
filteringDelegate.ImageViewControllerDidFinish(filteredImage);
}
DismissViewController(false, null);
}
}
有没有办法解决这个问题?
谢谢 设置“slider.Continuous=false”解决了该问题,该问题基于滑块的最后一个值显示图像,而不是存储每个值的更改。是否可以附加详细的错误消息?顺便说一句,您可以尝试调试您的应用。@ColeXia MSFT'2018-06-04 08:33:17.002 MobileApp.UI.iOS[19733:5710577]获得内存压力通知(非关键)2018-06-04 08:33:22.527 MobileApp.UI.iOS[19733:5710577]获得内存压力通知(关键)线程已完成:#11线程已启动:#16线程0xb已退出,代码为0(0x0)。应用程序已被终止。无法停止应用程序:客户端IDB490753在为主题xvs/idb/4.9.0.753/Stop-app执行回复时出错。应用程序已终止。“@ColeXia MSFT它说探查器只能在VS Enterprise上,我使用VS professional。