Swift3에서 Data를 NSData에 브리지시켜 사용하면 충돌하는 일이 있다
재현 코드
탭하면 적절한 이미지를 만들어 PNG
Data
를 생성하고 파일에 저장하는 코드입니다.Data
를 NSData
로 캐스트하고 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:)
(을)를 호출할 수 있어, 크래쉬도 하지 않게 됩니다.마지막으로
서둘러 썼기 때문에 실수가 있으면 죄송합니다.
왜 부정 종료하는지 등, 아시는 분이 계시면 정보를 받을 수 있으면 도움이 됩니다.
Reference
이 문제에 관하여(Swift3에서 Data를 NSData에 브리지시켜 사용하면 충돌하는 일이 있다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takabosoft/items/f7eab4ef28753825251a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)