2016-08-24 11 views
2

このコードでは、現在バインドされている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つ質問がありますが、写真をフォトアルバムに保存すると、通常の画像のように圧縮されるか、生データと同じサイズになりますか?

+0

'ScreenshotSaving'サブクラス「NSObject」を作成しても同じエラーが表示されますか? –

+0

'NSObject'をサブクラス化せず、代わりに' finishedPic() 'の' @ objc'の代わりに 'dynamic'を使うのも面白いでしょう –

+0

@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のキャッチされない例外で終了 –

答えて

1

現在のクラッシュは、クラスがNSObjectのサブクラスではないため、ターゲットメソッド(func)の検索方法がわからないためです。

私はあなたが既にコメントでそれを試して参照してください参照してください。これを試してみるとクラッシュするのは、この場合セレクターに特定の要件があるからです。

- (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo 

名が異なっていてもよいが、それはそれらのタイプの3つのパラメータを取る必要があります選択のためのメソッドのシグネチャは、(形式)と一致しなければなりません。

func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:Un 
関連する問題