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