URLSession image download crash - Thread 12: EXC_BAD_ACCESS (code=1,

192 Views Asked by At

I am using URLSession to download image and mapping to the image item imageview. But getting crash on below line always. I tried using Kingfisher, but still getting crash on same line

URLSession :

 class ImageFetchOperation: AsyncOperation {
    let imageItem: ImageItem
    let session: URLSession
    private var dataTask: URLSessionDataTask?
    var menuImageView: UIImageView!
    init(imageItem:ImageItem, session:URLSession) {
        self.imageItem = imageItem
        self.session = session
    }
    
    override func main() {
        
        
        if let imageUrl = URL(string: self.imageItem.imageUrl) {
            var request = URLRequest(url: imageUrl)
            request.httpMethod = "GET"
            //request.cachePolicy = .returnCacheDataElseLoad
            //print(imageUrl)
            dataTask = session.dataTask(with: request as URLRequest, completionHandler: { [weak self] (data: Data?, response: URLResponse?, error: Error?) -> Void in
                guard !(self?.isCancelled)! else {
                    self?.state = .isFinished
                    return
                }
                guard let data = data else {
                    self?.state = .isFinished
                    return
                }
                OperationQueue.main.addOperation {
                    self?.imageItem.image = UIImage.init(data:data) // Getting crash here
                }
                self?.state = .isFinished

            })
            dataTask?.resume()
        }
        else {
            self.state = .isFinished
        }
   
    }
}

Kingfisher

  if let imageUrl = self.imageItem.imageUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed) {
        DispatchQueue.main.async {
            self.menuImageView = UIImageView()
            let url = URL(string: imageUrl)
            self.menuImageView.kf.indicatorType = .activity
            self.menuImageView!.kf.setImage(with: url, completionHandler:  { [weak self] (image, error, cache, url) in
                self?.imageItem.image = image // Getting crash here
                self?.state = .isFinished
            })
        }

    }

In both code getting crash on :

   self?.imageItem.image = UIImage.init(data:data)

   self?.imageItem.image = image

Any help would be great here.

Crash : Thread 12: EXC_BAD_ACCESS (code=1, address=0x2600010c)

Image URL is proper only:

https://upload.wikimedia.org/wikipedia/commons/6/6a/Johann_Sebastian_Bach.jpg

Crash image

@objcMembers class ImageItem: NSObject {
    let imageUrl: String
    dynamic var image: UIImage!

    init(imageUrl: String) {
        self.imageUrl = imageUrl.addingPercentEncoding( withAllowedCharacters: .urlQueryAllowed)!
        self.image = nil
    }
    init(imageName: String) {
        self.imageUrl = ""
        self.image = UIImage(named: imageName)
    }
}
1

There are 1 best solutions below

1
Vladimir On

Can you post your whole code, please? I tried to reproduce your code and it worked for me. Here is what I tried:

import Foundation
import UIKit

enum State {
    case isFinished
    case isCancelled
}

struct Image {
    var imageUrl: String
    var image: UIImage?
    
    init(imageUrl: String, image: UIImage?) {
        self.imageUrl = imageUrl
        self.image = image
    }
}

class ViewController: UIViewController {
    
    var dataTask: URLSessionDataTask?
    let session = URLSession(configuration: .default)
    var isCancelled: Bool = false
    var state: State?
    var imageItem = Image(imageUrl: "https://upload.wikimedia.org/wikipedia/commons/6/6a/Johann_Sebastian_Bach.jpg", image: nil)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if let imageUrl = URL(string: self.imageItem.imageUrl) {
            var request = URLRequest(url: imageUrl)
            request.httpMethod = "GET"
            //request.cachePolicy = .returnCacheDataElseLoad
            //print(imageUrl)
            dataTask = session.dataTask(with: request as URLRequest, completionHandler: { [weak self] (data: Data?, response: URLResponse?, error: Error?) -> Void in
                guard !(self?.isCancelled)! else {
                    self?.state = .isFinished
                    return
                }
                guard let data = data else {
                    self?.state = .isFinished
                    return
                }
                OperationQueue.main.addOperation {
                    self?.imageItem.image = UIImage.init(data:data) // Getting crash here
                    if let image = self?.imageItem.image {
                        let imageView = UIImageView(image: image)
                        self?.view.addSubview(imageView)
                        
                        imageView.translatesAutoresizingMaskIntoConstraints = false
                        
                        NSLayoutConstraint.activate([
                            imageView.centerXAnchor.constraint(equalTo: (self?.view.centerXAnchor)!),
                            imageView.centerYAnchor.constraint(equalTo: (self?.view.centerYAnchor)!),
                        ])
                    }
                }
                self?.state = .isFinished

            })
            dataTask?.resume()
        }
        else {
            self.state = .isFinished
        }
    }
}