Swift3에서 Data를 NSData에 브리지시켜 사용하면 충돌하는 일이 있다

재현 코드



탭하면 적절한 이미지를 만들어 PNG Data를 생성하고 파일에 저장하는 코드입니다.DataNSData 로 캐스트하고 write(toFile:atomically:) 를 호출하면 충돌합니다.

(iOS8.4에서 확인. iOS10에서는 재현하지 않고.)

ViewController.swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let path = (documentDirectory as NSString).appendingPathComponent("test.dat")

        UIGraphicsBeginImageContext(CGSize(width: 100, height: 100))
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        if let img = img, let data = UIImagePNGRepresentation(img) {
            if (data as NSData).write(toFile: path, atomically: false) {
                print("保存しました。")
            }
        }
    }
}

오류 부분





회피 방법



보통으로 Data 형의 쪽의 내보내기 기능을 사용하면 좋을 것 같습니다.

다만, 사용성이 그다지 좋지 않았기 때문에 extension했습니다.
extension Data {
    @discardableResult
    func write(toFile: String, atomically: Bool) -> Bool {
        return (try? self.write(to: URL(fileURLWithPath: toFile), options: atomically ? .atomic : [])) != nil
    }
}

이것으로 브리지시키지 않아도, write(toFile:atomically:) (을)를 호출할 수 있어, 크래쉬도 하지 않게 됩니다.

마지막으로



서둘러 썼기 때문에 실수가 있으면 죄송합니다.
왜 부정 종료하는지 등, 아시는 분이 계시면 정보를 받을 수 있으면 도움이 됩니다.

좋은 웹페이지 즐겨찾기