2017-04-25 9 views
0

IユーザーUIGraphicsGetImageFromCurrentImageContextを使用してUIImageを取得し、@IBOutllet弱いUImageView.imageに割り当てる0.1秒あたりの機能リピートを発射タイマー。(coverImageView)のiOSメモリ警告

var timer:Timer? 

func fireTimer() { 
    timer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { [weak self] _ in 
     self?.lightTheFier() 
    }) 
} 

func invalidateTimer() { 
    timer?.invalidate() 
    timer = nil 
} 

func lightTheFier() { 
    var points = [CGPoint]() 
    for pin in pins { 
     let point = mapView.convert(pin.coordinate, toPointTo: coverImageView) 
     points.append(point) 
    } 
    coverImageView.image = getMaskedImage(points: points, zoomLevel: Int(mapView.zoomLevel())) 
} 

func getOringinalImageFromPath() -> UIImage{ 
    UIGraphicsBeginImageContextWithOptions(coverImageView.bounds.size, false, 0.0) 
    let path = UIBezierPath(rect: coverImageView.bounds) 
    UIColor.black.setFill() 
    path.fill() 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image! 
} 

func getMaskImageFromPath(points:[CGPoint], scale:CGFloat) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(coverImageView.bounds.size, false, 0.0) 
    let radius:CGFloat = 10.0 
    UIColor.blue.setFill() 
    for point in points { 
     let rect = CGRect(x: point.x - (scale*radius/2), y: point.y - (scale*radius/2), width: scale*radius, height: scale*radius) 
     let path = UIBezierPath(ovalIn: rect) 
     path.fill() 
    } 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    return image! 
} 

func getMaskedImage(points:[CGPoint], zoomLevel:Int) -> UIImage{ 
    let orImage = getOringinalImageFromPath().cgImage 
    let maskImage = getMaskImageFromPath(points: points, scale: CGFloat(zoomLevel)).cgImage 
    let mask = CGImage(maskWidth: maskImage!.width, height: maskImage!.height, bitsPerComponent: maskImage!.bitsPerComponent, bitsPerPixel: maskImage!.bitsPerPixel, bytesPerRow: maskImage!.bytesPerRow, provider: maskImage!.dataProvider!, decode: nil, shouldInterpolate: true) 
    let maskRef = orImage?.masking(mask!) 
    let image = UIImage(cgImage: maskRef!) 
    return image 
} 

すべてのコード上記のものはテスト用のViewController.swiftにあります。

機能が動作している間にメモリが増えていても問題ありません。タイマーを無効にするとメモリを解放できます。

この問題を解決するにはどうすればよいですか?

+1

は、おかげで私はそれを編集した –

+0

を試してみるのコードを入れて! –

+0

ARCでは、一部の変数の割り当てを解除するには、その参照を使用するすべての変数が範囲外になる必要があります。 'coverImageView'がスコープの外に出るところを見てください。より良いアプローチは、タイマーを使用する代わりに、必要なときにイメージを要求することです。だから、画像を表示する必要があるときには、画像がすでに利用可能かどうかを確認してください。 – user1046037

答えて

0

あなたは画像のコンテキストを開始しています:UIGraphicsBeginImageContextWithOptions、しかしあなたはそれを決して終わらせません。あなたのgetMaskImageFromPathgetOringinalImageFromPath方法にUIGraphicsEndImageContext()を追加する必要があります。

func getMaskImageFromPath(points:[CGPoint], scale:CGFloat) -> UIImage { 
    UIGraphicsBeginImageContextWithOptions(coverImageView.bounds.size, false, 0.0) 
    let radius:CGFloat = 10.0 
    UIColor.blue.setFill() 
    for point in points { 
     let rect = CGRect(x: point.x - (scale*radius/2), y: point.y - (scale*radius/2), width: scale*radius, height: scale*radius) 
     let path = UIBezierPath(ovalIn: rect) 
     path.fill() 
    } 
    let image = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() // Missing this line 
    return image! 
} 
+0

実行ループはタイマーを保持します。 –

+0

こんにちは、デイブ、私はそれを固定して実行した後、それは多くのメモリを節約します!まあ、しかし、私はそれを前方に修正することができます私は発射し、タイマを無効にした後、メモリが増加しますが減少することはありません? –

+0

多分、問題が何であるかを見つけるために私に指示を与える、ありがとうございます! –

関連する問題