遅れましたが、Xcode7.3、Swift2.2に対応した PDFGenerator 1.1.4
をリリースしました。
丁度1週間前くらいに、issue報告が上がっていたのですが、なかなか時間が取れずに今日まで原因の特定と解決ができずにいました。
原因
どうやら、 enum で定義した PDFPage のタイプによって、PDFのページをレンダリングする処理を分岐していたのですが、
その時に、switchステートメント内で、tryを実行しようとすると、Segmentation fault 11
が、 Releaseビルド 時に発生するという、少々厄介なものでした。
class func renderPage(page: PDFPage) throws { // throws属性をつけている
func renderImage(imageConvertible: UIImageConvertible) throws {
try autoreleasepool {
try imageConvertible.to_image().renderPDFPage()
}
}
switch page {
case .WhitePage(let size):
try autoreleasepool {
let view = UIView(frame: CGRect(origin: .zero, size: size))
view.backgroundColor = .whiteColor()
try view.renderPDFPage()
} // これは◯
case .View(let view):
try view.renderPDFPage() // ×
case .Image(let image):
try renderImage(image) // ×
case .ImagePath(let ip):
try renderImage(ip) // ×
case .Binary(let data):
try renderImage(data) // ×
case .ImageRef(let cgImage):
try renderImage(cgImage) // ×
}
}
一応、関数に対してthrows
を与えているので、 try を書くことは問題ないはずなのですが、何故か × をつけた箇所だけ、Segmentation fault 11
が発生しました。
一方で、◯を付けた、 rethrows
を与えている、自作関数autoreleasepool+tryは問題なかったです。謎。。
Swift2.1では何の問題もなかったのに、Swift2.2で引っかかったので、何かが作用したのか、或いはバグなのか。。
修正
結局、レンダリングした際に生成するViewやImageは autoreleasepool で解放したかったので、switchステートメントをまるっと囲みました。
class func renderPage(page: PDFPage) throws {
func renderImage(imageConvertible: UIImageConvertible) throws {
try imageConvertible.to_image().renderPDFPage()
}
try autoreleasepool {
switch page {
case .WhitePage(let size):
let view = UIView(frame: CGRect(origin: .zero, size: size))
view.backgroundColor = .whiteColor()
try view.renderPDFPage()
case .View(let view):
try view.renderPDFPage()
case .Image(let image):
try renderImage(image)
case .ImagePath(let ip):
try renderImage(ip)
case .Binary(let data):
try renderImage(data)
case .ImageRef(let cgImage):
try renderImage(cgImage)
}
}
}
おかげさまで
使ってくださっている方のおかげで不具合が見つかって、メンテナンスができているので、本当に感謝です。
また、しばらく見ないうちに、(graphを見る感じだと、3/31〜4/1あたり?で)starが 15近く跳ね上がって 、35になっていたので、嬉しかったです。