首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PPSSignatureView中崩溃

在PPSSignatureView中崩溃
EN

Stack Overflow用户
提问于 2015-04-17 14:28:33
回答 3查看 609关注 0票数 1

我正在使用Xcode 6为iOS 7开发一个应用程序。我从GitHub下载的PPSSignatureView组件有问题。我要在弹出框里展示签名图。第一次显示签名视图时,它工作正常,一切都很好。但是,当我第二次重新显示相同的弹出窗口时,我在PPSSignatureView.m中出现了一个错误

代码语言:javascript
复制
#import <OpenGLES/ES2/glext.h>

// Append vertex to array buffer
static inline void addVertex(uint *length, PPSSignaturePoint v) {
    if ((*length) >= maxLength) {
        return;
    }

    GLvoid *data = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
    memcpy(data + sizeof(PPSSignaturePoint) * (*length), &v, sizeof(PPSSignaturePoint));
    glUnmapBufferOES(GL_ARRAY_BUFFER);

    (*length)++;
}

在第二次演示中,glMapBufferOES()返回NULLmemcpy()生成错误

代码语言:javascript
复制
Thread 1:EXC_BAD_ACCESS(code=1, address=0x0)

我不知道OpenGL库。我读过一些关于OpenGL、Xcode 6和iOS8的这样的条目,但是这些问题涉及编译时错误,而且我有一个运行时错误。有人明白这是怎么回事吗?

谢谢

编辑:我知道这个错误看起来像一个低内存错误。我没有收到iOS的内存警告,我很难相信这才是真正的问题。另外,在第二次和以后的演示文稿中,如果在开始绘图之前对签名视图进行长时间的按下,则签名视图不会崩溃。但是,在第二次演示文稿中调用长按压操作并不能防止崩溃。

以下是冗长的新闻代码:

代码语言:javascript
复制
- (void)longPress:(UILongPressGestureRecognizer *)lp {
    [self erase];
}


- (void)erase {
    length = 0;
    dotsLength = 0;
    self.hasSignature = NO;

    [self setNeedsDisplay];
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-05 15:46:50

我通过添加调用来修正错误

代码语言:javascript
复制
[signatureView erase]

在显示包含签名视图的弹出之后立即。

票数 1
EN

Stack Overflow用户

发布于 2015-06-04 19:20:09

我能够在iOS8上重新创建您的准确错误消息。由于消息不明确,这可能是由于另一个问题而收到的相同错误。

我是通过代码打开视图的:

代码语言:javascript
复制
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
PPSSignatureView *sign = [[PPSSignatureView alloc] initWithFrame:CGRectMake(10, 10, 500, 300) context:context];

我注意到,如果我将上下文更改为使用kEAGLRenderingAPIOpenGLES3而不是kEAGLRenderingAPIOpenGLES2,则会得到确切的错误。

如果您还没有使用kEAGLRenderingAPIOpenGLES2,请尝试使用:

代码语言:javascript
复制
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]; 

VS

代码语言:javascript
复制
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3]; 

我还解决了在iOS8上加载视图(第二次)的问题,iOS7可能也是如此。

据我所知,上下文(EAGLContext)在使用后不会被取消分配.这将导致下次在自定义签名视图中调用它时出错。

我对此的解决方案是(在声明上下文之前)清除任何现有的上下文。我这样做是使用以下代码:

代码语言:javascript
复制
[EAGLContext setCurrentContext:nil]
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
PPSSignatureView *sign = [[PPSSignatureView alloc] initWithFrame:CGRectMake(10, 10, 500, 300) context:context];

如果要通过UI/情节提要声明它,则在打开新视图之前,可能需要在事件中清除它。我仍然不确定我100%理解这一点;如果有人对此有意见,请留下评论。

票数 0
EN

Stack Overflow用户

发布于 2016-08-01 13:09:28

当您输入PPSSignatureView时,您可以这样编写:

代码语言:javascript
复制
[EAGLContext setCurrentContext:nil];
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
PPSSignatureView *sign = [[PPSSignatureView alloc] initWithFrame:CGRectMake(0, 0, self.view.height, self.view.width) context:context];

我还是不知道这是为什么,但这解决了我的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29702030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档