草庐IT

ios - 将 FBO 保存到相机胶卷后清理后出现崩溃错误? Swift 2.0 选择器语法

coder 2023-09-16 原文

所以我有这段代码可以将当前绑定(bind)的 FBO 保存到相机胶卷。这段代码的第一部分工作得很好!如果我不尝试清理缓冲区或图像引用,一切正常,并且照片会放在相机胶卷内。不幸的是,结果有 4mb 的内存泄漏。

显然我需要清理一些数据。

我首先想到的是我的 var buffer = UnsafeMutablePointer<GLubyte>(nil)问题是,如果您在 UIImageWriteToSavedPhotosAlbum 之后立即清除它调用你会得到一个非常奇怪的崩溃错误,没有有意义的堆栈跟踪。

所以我认为数据保存到相册需要时间,因此我需要使用完成选择器。问题是我尝试了几种不同的方法来使用选择器 block ,但每次我遇到崩溃和来自“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)
    }
}

还有一个问题,当照片保存到相册时,它是像普通图像一样压缩还是与原始数据相同?

最佳答案

你当前的崩溃是因为你的类不是 NSObject 的子类,所以它不知道如何找到目标方法 (func)。

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

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

名称可以不同,但​​必须采用 3 个具有这些类型的参数。

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

关于ios - 将 FBO 保存到相机胶卷后清理后出现崩溃错误? Swift 2.0 选择器语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39112898/

有关ios - 将 FBO 保存到相机胶卷后清理后出现崩溃错误? Swift 2.0 选择器语法的更多相关文章

  1. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  2. Ruby Readline 在向上箭头上使控制台崩溃 - 2

    当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  7. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

  10. ruby - 将哈希值保存到 Ruby 上的文件 - 2

    我刚刚迈出了编程的第一步。我刚刚完成了CodeAcademy的另一门类(class)。这次我被要求创建一个小电影目录。这是我的问题:如何在文件中保存/加载带有电影标题和评级的哈希值而不是自己的代码?下面是代码现在的样子(几句葡萄牙语,但您可以忽略它:movies={Memento:3,Primer:4,Ishtar:1}puts"Oquevocêgostariadefazer?"puts"--Digite'add'paraadicionarumfilme."puts"--Digite'update'paraatualizarumfilme."puts"--Digite'display'

随机推荐