このコードでは、現在バインドされているFBOをカメラロールに保存します。このコードの最初の部分は完全に機能します!バッファや画像の参照をすべてクリーンアップしようとしないと、画像がカメラロールの内側に配置されます。残念なことに、結果として4MBのメモリリークが発生します。FBOをカメラロールに保存した後のクリーンアップ後のクラッシュエラー? Swift 2.0のセレクタ構文
明らかに私はいくつかのデータを整理する必要があります。
最初に見たと思ったのはvar buffer = UnsafeMutablePointer<GLubyte>(nil)
でした。UIImageWriteToSavedPhotosAlbum
コールの直後にこの問題を解決すれば、意味をなさないスタックトレースで本当に奇妙なエラーが発生します。
このようにデータをフォトアルバムに保存するには、完了セレクタを使用する必要があることがわかります。参考のため
NSForwarding: warning: object 0x16e6bb60 of class 'App.ScreenshotSaving' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[App.ScreenshotSaving methodSignatureForSelector:]
このクラスは内部でインスタンス化されています。問題は、私は、セレクタブロックを使用してのカップルさまざまな方法を試してみましたが、私はクラッシュを取得するたびに、私は得るこの場合の「NSForwarding」からのメッセージがありますそう
class Storage
{
static var ssave = ScreenshotSaving()
}
とスクリーンショットStorage.ssave.saveScreenshot()
を取るためにその時間が呼ばれたときなどのような静的クラスの。
import Foundation
import GLKit
import OpenGLES
import Fabric
class ScreenshotSaving
{
var myImage = UIImage()
var buffer = UnsafeMutablePointer<GLubyte>(nil)
func saveScreenshot()
{
var width:GLint = 0
var height:GLint = 0
glGetRenderbufferParameteriv(GLenum(GL_RENDERBUFFER), GLenum(GL_RENDERBUFFER_WIDTH), &width)
glGetRenderbufferParameteriv(GLenum(GL_RENDERBUFFER), GLenum(GL_RENDERBUFFER_HEIGHT), &height)
let mdl:Int = Int(width * height * 4)
buffer = UnsafeMutablePointer<GLubyte>(malloc(Int(mdl)))
glReadPixels(0, 0, width, height, GLenum(GL_RGBA), GLenum(GL_UNSIGNED_BYTE), buffer)
let provider = CGDataProviderCreateWithData(nil, buffer, mdl, nil)
let bitsPerComponent:Int = 8
let bitsPerPixel:Int = 32
let bytesPerRow:Int = 4 * Int(width)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo:CGBitmapInfo = CGBitmapInfo(rawValue: 0 << 12)
let renderIntent = CGColorRenderingIntent.RenderingIntentDefault
let imageRef = CGImageCreate(Int(width), Int(height), bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapInfo, provider, nil, false, renderIntent)
FabricI.crashLog("Save screenshot: Finished image ref")
myImage = UIImage(CGImage: imageRef!)
UIImageWriteToSavedPhotosAlbum(myImage, self, #selector(ScreenshotSaving.finishedPic), nil)
}
@objc func finishedPic()
{
myImage = UIImage()
free(buffer)
}
}
もう1つ質問がありますが、写真をフォトアルバムに保存すると、通常の画像のように圧縮されるか、生データと同じサイズになりますか?
'ScreenshotSaving'サブクラス「NSObject」を作成しても同じエラーが表示されますか? –
'NSObject'をサブクラス化せず、代わりに' finishedPic() 'の' @ objc'の代わりに 'dynamic'を使うのも面白いでしょう –
@BenKaneこれは動作しませんが、新しいクラッシュエラーが発生します" 2016-08-26 00:07:22.224 Trillium [5461:1043289] ***キャッチされていない例外 'NSInvalidArgumentException'のためアプリを終了しています、理由: ' - [NSInvocation setArgument:atIndex:]:index(2) 1、1]」 ***まずスローコールスタック: (0x259db91b 0x25176e17 0x2590647f 0x2da45a31 0x2da463e7 0x2d4c718b 0xb76b7f 0xb76b6b 0xb7b655 0x2599db6d 0x2599c067 0x258eb229 0x258eb015 0x26edbac9 0x29fbf189 0xaf668 0x25593873) のlibC++ abi.dylib:「タイプNSExceptionのキャッチされない例外で終了 –