2017-04-25 1 views
0

I 사용자 UIGraphicsGetImageFromCurrentImageContext를 사용하여있는 UIImage를 얻을하고 A @IBOutllet 약한 UImageView.image에 할당 0.1 초당 함수의 반복을 발사 타이머. (coverImageView)아이폰 OS 메모리 경고

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

안녕하세요, Dave, 고정시키고 실행 한 후에 많은 메모리를 절약합니다! 글쎄,하지만 메모리가 증가하지만 타이머를 해고하고 무효화 한 후에도 결코 줄어들지 않습니다. 어떻게 해결할 수 있습니까? –

+0

또는 문제 해결 방법을 알려주는 안내서를 보내 주시면 감사하겠습니다. –