我正在使用Xcode 6为iOS 7开发一个应用程序。我从GitHub下载的PPSSignatureView组件有问题。我要在弹出框里展示签名图。第一次显示签名视图时,它工作正常,一切都很好。但是,当我第二次重新显示相同的弹出窗口时,我在PPSSignatureView.m中出现了一个错误
#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()返回NULL,memcpy()生成错误
Thread 1:EXC_BAD_ACCESS(code=1, address=0x0)我不知道OpenGL库。我读过一些关于OpenGL、Xcode 6和iOS8的这样的条目,但是这些问题涉及编译时错误,而且我有一个运行时错误。有人明白这是怎么回事吗?
谢谢
编辑:我知道这个错误看起来像一个低内存错误。我没有收到iOS的内存警告,我很难相信这才是真正的问题。另外,在第二次和以后的演示文稿中,如果在开始绘图之前对签名视图进行长时间的按下,则签名视图不会崩溃。但是,在第二次演示文稿中调用长按压操作并不能防止崩溃。
以下是冗长的新闻代码:
- (void)longPress:(UILongPressGestureRecognizer *)lp {
[self erase];
}
- (void)erase {
length = 0;
dotsLength = 0;
self.hasSignature = NO;
[self setNeedsDisplay];
}发布于 2015-06-05 15:46:50
我通过添加调用来修正错误
[signatureView erase]在显示包含签名视图的弹出之后立即。
发布于 2015-06-04 19:20:09
我能够在iOS8上重新创建您的准确错误消息。由于消息不明确,这可能是由于另一个问题而收到的相同错误。
我是通过代码打开视图的:
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
PPSSignatureView *sign = [[PPSSignatureView alloc] initWithFrame:CGRectMake(10, 10, 500, 300) context:context];我注意到,如果我将上下文更改为使用kEAGLRenderingAPIOpenGLES3而不是kEAGLRenderingAPIOpenGLES2,则会得到确切的错误。
如果您还没有使用kEAGLRenderingAPIOpenGLES2,请尝试使用:
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2]; VS
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES3]; 我还解决了在iOS8上加载视图(第二次)的问题,iOS7可能也是如此。
据我所知,上下文(EAGLContext)在使用后不会被取消分配.这将导致下次在自定义签名视图中调用它时出错。
我对此的解决方案是(在声明上下文之前)清除任何现有的上下文。我这样做是使用以下代码:
[EAGLContext setCurrentContext:nil]
EAGLContext *context = [EAGLContext alloc]initWithAPI:kEAGLRenderingAPIOpenGLES2];
PPSSignatureView *sign = [[PPSSignatureView alloc] initWithFrame:CGRectMake(10, 10, 500, 300) context:context];如果要通过UI/情节提要声明它,则在打开新视图之前,可能需要在事件中清除它。我仍然不确定我100%理解这一点;如果有人对此有意见,请留下评论。
发布于 2016-08-01 13:09:28
当您输入PPSSignatureView时,您可以这样编写:
[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];我还是不知道这是为什么,但这解决了我的问题。
https://stackoverflow.com/questions/29702030
复制相似问题