Ios 将FBO保存到摄影机卷后清理后发生崩溃错误?Swift 2.0选择器语法

Ios 将FBO保存到摄影机卷后清理后发生崩溃错误?Swift 2.0选择器语法,ios,swift,buffer,Ios,Swift,Buffer,因此,我有这个代码来保存一个当前绑定的FBO到相机卷。这段代码的第一部分工作得非常好!如果我不尝试清理缓冲区或图像参考,一切都会正常工作,并且会将一张图片放在相机卷内。不幸的是,结果是4mb内存泄漏 显然我需要清理一些数据 我想看的第一个地方是我的var buffer=UnsafeMutablePointer(nil)问题是,如果在调用UIImageWriteToSavedPhotosAlbum之后立即清除,就会出现一个非常奇怪的崩溃错误,没有意义的堆栈跟踪 因此,我认为数据保存到相册需要时间,

因此,我有这个代码来保存一个当前绑定的FBO到相机卷。这段代码的第一部分工作得非常好!如果我不尝试清理缓冲区或图像参考,一切都会正常工作,并且会将一张图片放在相机卷内。不幸的是,结果是4mb内存泄漏

显然我需要清理一些数据

我想看的第一个地方是我的
var buffer=UnsafeMutablePointer(nil)
问题是,如果在调用
UIImageWriteToSavedPhotosAlbum
之后立即清除,就会出现一个非常奇怪的崩溃错误,没有意义的堆栈跟踪

因此,我认为数据保存到相册需要时间,因此我需要使用完成选择器。问题是我尝试了几种不同的方法来使用选择器块,但每次我从“NSForwarding”收到崩溃和消息时,我都会得到:

NSForwarding: warning: object 0x16e6bb60 of class 'App.ScreenshotSaving' does not implement methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[App.ScreenshotSaving methodSignatureForSelector:]
对于引用,该类在一个静态类中实例化,如下所示

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)
    }
}
<代码>导入基础 进口GLKit 导入OpenGLES 进口织物 类截图保存 { var myImage=UIImage() var buffer=unsafemeutablepointer(nil) func保存屏幕截图() { 变量宽度:闪烁=0 变量高度:闪烁=0 GLGetRenderBuffer参数(格伦(格伦布弗)、格伦(格伦布弗宽度)和宽度) GLGETRENDERBUFFER参数(格伦(格伦布弗)、格伦(格伦布弗高度)和高度) 设mdl:Int=Int(宽*高*4) buffer=UnsafeMutablePointer(malloc(Int(mdl))) glReadPixels(0,0,宽度,高度,格伦(GL_RGBA),格伦(GL_无符号字节),缓冲区) 让provider=CGDataProviderCreateWithData(nil,buffer,mdl,nil) 让bitsPerComponent:Int=8 设bitsPerPixel:Int=32 let bytesperow:Int=4*Int(宽度) 让colorSpace=CGColorSpaceCreateDeviceRGB()
让bitmapInfo:CGBitmapInfo=CGBitmapInfo(rawValue:0您当前的崩溃是因为您的类不是
NSObject
的子类,所以它不知道如何找到目标方法(func)

我看到您已经在注释中尝试了该方法。尝试该方法时出现崩溃是因为选择器在这种情况下有特定的要求。选择器的方法签名必须匹配(形式为):

名称可以不同,但必须包含3个具有这些类型的参数

func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:Un

如果进行
ScreenshotSaving
子类
NSObject
,是否会出现同样的错误?我还想知道
finishedPic()是否没有子类化
NSObject
,而是使用
dynamic
而不是
@objc
works@BenKane这不起作用,但它确实会导致新的崩溃错误“2016-08-26 00:07:22.224 Trillium[5461:1043289]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[NSInvocation setArgument:atIndex:::]:索引(2)超出边界[-1,1]'***第一次抛出调用堆栈:(0x259db91b 0x25176e17 0x2590647f 0x2da45a31 0x2da463e7 0x2d4c718b 0xb76b7f 0xb76b6b 0xb7b655 0x2599db6d 0x2599c067 0x258eb229 0x258eb015 0x26edbac9 0x29fbf189 0xaf668 0x25593873)libc++.dylib:以NSException类型的未捕获异常终止“将
@objc
更改为
动态
是否停止崩溃?
func image(image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:Un