Swift5 MacOS ImageResize内存问题 [英] Swift5 MacOS ImageResize memory issue

查看:50
本文介绍了Swift5 MacOS ImageResize内存问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是使用Swift进行Mac OS App开发的新手.但是我尝试制作简单的ImageResizer应用.我必须调整50k图像的大小.10小时后,内存已增加到每GB 120GB.我以为Swift也有垃圾收集器.为什么增加内存?我将向您展示我的代码.

  for i in 0 ..< paths.count {让路径=路径[i]如果让image = NSImage(contentsOf:path){...如果self.resize(image:image,size:size,to:URL(fileURLWithPath:resizedImagePath)){print(图像已保存到\(resizedImagePath)")继续}}}func resize(image:NSImage,size:Int,to url:URL)->布尔{如果!image.isValid {打印(无效图片")返回假}警卫队,让pixelWide = image.representations.first?.pixelsWide else {返回假}令因子:CGFloat = CGFloat(pixelsWide)/image.size.widthvar width:CGFloat = CGFloat(size)var高度:CGFloat = CGFloat(大小)如果image.size.width>image.size.height {高度=宽度* image.size.height/image.size.width} 别的 {宽度=高度* image.size.width/image.size.height}让rep = NSBitmapImageRep(bitmapDataPlanes:nil,pixelWide:Int(width),pixelHigh:Int(高度),bitsPerSample:8samplesPerPixel:4hasAlpha:是的,isPlanar:否,colorSpaceName:.deviceRGB,bytesPerRow:Int(宽度* 4),bitsPerPixel:32)rep?.size = NSSize(宽度:宽度/因数,高度:高度/因数)让ctx = NSGraphicsContext(bitmapImageRep:rep!)NSGraphicsContext.saveGraphicsState()NSGraphicsContext.current = ctximage.draw(在:NSMakeRect(0,0,宽度/因数,高度/因数))ctx?.flushGraphics()NSGraphicsContext.restoreGraphicsState()//获取NSData并保存let data = rep?.representation(using:.png,properties:[:])//属性为![String:任何])//做 {尝试数据?.写(到:url)返回真}抓住 {返回假}} 

解决方案

您可以将整个代码放入

You can put your whole code that it is inside your loop inside an autoreleasepool:

If you write a loop that creates many temporary objects. You may use an autorelease pool block inside the loop to dispose of those objects before the next iteration. Using an autorelease pool block in the loop helps to reduce the maximum memory footprint of the application.

for i in paths.indices {
    autoreleasepool {
        // all your image resizing code goes here
    }
}

这篇关于Swift5 MacOS ImageResize内存问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆