2017-09-12 11 views
-2

以下のコードを実行するとメモリリークが発生します。私はまだnewImageオブジェクトを使用していないか、持っていません。iOS:UIImageを拡大縮小しようとするとメモリリークが発生する

for image in imageArray { 
    autoreleasepool { 
     let newImage = image.scalingWith(targetSize: CGSize(width: 500, height: 500)) 
    } 
} 

、ここUIImage延長でのスケールの方法です:

func scaleWith(targetSize: CGSize, backgroundColor: UIColor = UIColor 
    .white) -> UIImage? { 
    let imageSize = size 
    var scaleFactor: CGFloat = 0.0 
    let scaledWidth = targetSize.width 
    let scaledHeight = targetSize.height 
    var thumbnailPoint = CGPoint.zero 

    if imageSize.equalTo(targetSize) { return self } 

    let widthFactor = targetSize.width/imageSize.width 
    let heightFactor = targetSize.height/imageSize.height 

    if widthFactor > heightFactor { 
     scaleFactor = heightFactor 
     thumbnailPoint.x = (targetSize.width - scaleFactor * imageSize.width) * 0.5; 
    } else { 
     scaleFactor = widthFactor 
     thumbnailPoint.y = (targetSize.height - scaleFactor * imageSize.height) * 0.5; 
    } 

    UIGraphicsBeginImageContext(CGSize(width: scaledWidth, height: scaledHeight)) 

    let context = UIGraphicsGetCurrentContext() 
    let bounds = CGRect(x: 0, y: 0, width: scaledWidth, height: scaledHeight) 
    context!.setFillColor(backgroundColor.cgColor) 
    context!.fill(bounds) 

    var thumbnailRect = CGRect.zero 
    thumbnailRect.size.width = imageSize.width * scaleFactor; 
    thumbnailRect.size.height = imageSize.height * scaleFactor; 
    thumbnailRect.origin = thumbnailPoint 

    draw(in: thumbnailRect) 
    let resultImage = UIGraphicsGetImageFromCurrentImageContext() 

    UIGraphicsEndImageContext(); 

    return resultImage 
} 

誰も私にいくつかのアドバイスを与えることができますか?

答えて

0

一般に、メモリリークを有効にした計測器でこのコードを実行するのは簡単です。また、シミュレータ上で実行すると誤った結果になるので、デバイス上で実行する必要があります。 Xcodeには、デバッグモードでコンソールを使用しているときにオブジェクトをリリースしていないバグがありました。

再度、デバイス上の計測器で実行します。コードは良く見えますが、メモリリークがあってはいけません。 また、ループ内のコードを考慮してautoreleasepoolが必要ですか?

+0

ありがとうございました。私はコードをテストするためにデバイスを使用しましたが、Instrumentsは使用しませんでした。だから私は再びInstrumentsで試しました。今はすべてがOKだと思う。ありがとうございました。 –

関連する問題