【问题标题】:Xcode image operations memory leakingXcode 图像操作内存泄漏
【发布时间】:2015-10-08 02:55:55
【问题描述】:

我目前正在开发的 iOS 项目存在问题。它经历了一个过程,它必须从服务器下载图像,将它们四舍五入并将它们放在黑色背景上,最后将它们保存为文件。这会遍历超过 2.000 个不同图像的 URL,并且必须对它们进行处理。问题是某处似乎存在巨大的内存泄漏,我只是不知道如何解决它。在应用程序终止之前,内存警告被触发了四次。

func getRoundedPNGDataFromData(imageData: NSData) -> NSData? {
    let Image: UIImage? = UIImage(data: imageData)!
    let ImageFrame: CGRect = CGRectMake(0, 0, Image!.size.width, Image!.size.height)
    UIGraphicsBeginImageContextWithOptions(Image!.size, false, 1.0);
    let CurrentContext: CGContextRef = UIGraphicsGetCurrentContext()
    CGContextSetFillColorWithColor(CurrentContext, UIColor.blackColor().CGColor)
    CGContextFillRect(CurrentContext, ImageFrame)
    UIBezierPath(roundedRect: ImageFrame, cornerRadius: 10.0).addClip()
    Image!.drawInRect(ImageFrame)
    let NewImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return UIImagePNGRepresentation(NewImage!)
}

...
var ProgressCounter: Int = 0
    for OID: String in MissingThumbnails {
    let CurrentProgress: CFloat = (CFloat(ProgressCounter) / CFloat(MissingThumbnails.count))
    dispatch_sync(dispatch_get_main_queue(), {
        progressView?.progress
        progressView?.setProgress(CurrentProgress, animated: true)
    })
    let ThumbURL: NSURL = NSURL(string: "http://\(Host):\(Port)/\(self.WebAPIThumbnailPath)".stringByReplacingOccurrencesOfString("${OID}", withString: OID, options: [], range: nil).stringByReplacingOccurrencesOfString("${ThumbnailNumber}", withString: self.padID(5), options: [], range: nil))!
    var ThumbData: NSData? = NSData(contentsOfURL: ThumbURL)
    if (ThumbData != nil) {
        if (ThumbData!.length > 0) {
                var RoundedPNG: NSData? = self.getRoundedPNGDataFromData(ThumbData!)
            if ((RoundedPNG!.writeToFile(FSTools.getDocumentSub("\(self.Structs[Paths.OBJ_THUMBNAILS])/\(OID).png"), atomically: false)) == false) {
                dispatch_sync(dispatch_get_main_queue(), {() -> Void in
                    UIApplication.sharedApplication().networkActivityIndicatorVisible = false
                    delegate?.thumbnailCacheCompleted?(false)
                })
            }
            RoundedPNG = nil
            ThumbData = nil
        }
    }
    ProgressCounter++
}

【问题讨论】:

  • 在 Xcode 中自动格式化代码以选择代码并输入 control-i 的技巧。
  • 感谢您的提示,但它实际上最终格式错误,因为我在发布之前从代码中删除了几行。不过将来可能有用:P

标签: ios xcode memory memory-leaks uiimage


【解决方案1】:

您需要在循环内添加一个自动释放池,以允许释放自动释放的内存。

for OID: String in MissingThumbnails {
    autoreleasepool {
      /* code */ 
    }
}

当当前自动释放池范围离开时,自动释放的内存被释放,这通常发生在运行循环中。但是如果代码很紧,runloop没有运行,内存是不会及时释放的。在每次迭代中添加显式自动释放池将允许在循环的每次迭代中回收这个临时自动释放的内存。

【讨论】:

  • 谢谢,成功了 ^^ 我记得曾经尝试过,但也许我只是放错了自动释放池......这让我免于很多额外的头痛:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2016-04-02
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多