ios - Crashing error after cleaning up after saving FBO to camera roll? Swift 2.0 selector syntax -
so have code save bound fbo camera roll. first part of code works perfectly! if dont try clean buffer or image reference works fine, , picture placed inside of camera roll. unfortunately there 4mb memory leak result.
so apparently need clean of data.
the first place thought var buffer = unsafemutablepointer<glubyte>(nil)
problem if clear right after uiimagewritetosavedphotosalbum
call odd crashing error no stack trace makes sense.
so figure takes time data save photo album such need use completion selector. problem have tried couple different ways of using selector block every time crash , message "nsforwarding" in case get:
nsforwarding: warning: object 0x16e6bb60 of class 'app.screenshotsaving' not implement methodsignatureforselector: -- trouble ahead unrecognized selector -[app.screenshotsaving methodsignatureforselector:]
for reference class instantiated inside of static class so
class storage { static var ssave = screenshotsaving() }
and such when time take screenshot storage.ssave.savescreenshot()
called.
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) } }
one more question, when photo saved photo album compressed regular image or same size raw data?
your current crash because class isn't subclass of nsobject
, doesn't know how find target method (func).
i see tried in comments. crash when try because selector has specific requirements in case. method signature selector must match (the form of):
- (void)image: (uiimage *) image didfinishsavingwitherror: (nserror *) error contextinfo: (void *) contextinfo
the name can different must take 3 parameters types.
func image(image: uiimage, didfinishsavingwitherror error: nserror?, contextinfo:un
Comments
Post a Comment