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에 있습니다.
함수가 실행되는 동안 메모리가 증가하는 것은 문제가되지 않습니다. 원하는 것은 타이머를 무효로 할 때 메모리를 해제 할 수 있다는 것입니다.
이 문제를 해결하려면 어떻게해야합니까?
가, 감사 당신은 내가 편집 한 –
시도가 코드를 넣어! –
ARC에서 일부 변수의 할당을 해제하려면 해당 참조를 사용하는 모든 변수가 범위를 벗어나야합니다. 'coverImageView'가 범위를 벗어나는 곳을보십시오. 더 나은 방법은 타이머를 사용하는 대신 필요할 때 이미지를 요청하는 것입니다. 따라서 이미지를 표시해야 할 때 이미 이미지를 사용할 수 있는지 확인한 다음 가져옵니다. – user1046037