在我最新的应用程序中遇到了一些令人沮丧的问题!Objective-C - 复制退出(0)并修复EXC_BAD_ACCESS
我正在使用OpenGLES 1在不断更新的屏幕上绘制模型,然后您可以截取屏幕并进行分享,然后您可以返回到应用程序开始屏幕并重新开始。
所有似乎工作正常的应用程序运行通过,没有崩溃。但是,如果你经历过一次,然后尝试再次尝试,只要OpenGLES图形视图必须开始绘制元素,它会在我的glDrawElements
行上抛出一个EXC_BAD_ACCESS
错误。
我放弃了现在试图解决这个错误,我在过去2周没有运气!
我已经在我的plist中设置了属性,以便应用程序不会在后台运行,并且每当我运行一次,然后退出并再次加载它时,它将再次运行完全正常。
所以我想知道的是,如果我能以某种方式模拟exit(0)
功能的功能,但实际上没有退出应用程序?
实际上,每次用户从共享页面导航回主页时,应用程序都会运行exit
代码,从而使应用程序再次从头开始运行。
在我的脑海里,至少这不会是一个很好的方式来处理这种情况,但我需要快速的结果,这似乎是一个很好的出路,直到我能够深入到底层实际错误。
感谢,
马特
编辑1:我不希望把应用程序的存储与此修复到位,它只是暂时的事情。
EDIT 2:发布代码包含我的抽奖功能,截断并从Bill Dudney's WaveFront .obj loader
for(WaveFrontOBJGroup *group in scene.groups)
{
NSString *matPath = [NSString stringWithFormat:@"%@%@.mtl", materialName, modelPart];
NSArray *materialArray = [WaveFrontOBJMaterial materialsFromLibraryFile:matPath];
WaveFrontOBJMaterial *mat = [materialArray objectAtIndex:0];
if(group.smoothing)
glShadeModel(GL_SMOOTH);
else
glShadeModel(GL_FLAT);
// load (if necessary) and bind the vertices
GLuint verticesName = [group verticesName:GL_STATIC_DRAW];
glBindBuffer(GL_ARRAY_BUFFER, verticesName);
glVertexPointer(3, GL_FLOAT, 0, 0);
// load (if necessary) and bind the normals
GLuint normalsName = [group normalsName:GL_STATIC_DRAW];
glBindBuffer(GL_ARRAY_BUFFER, normalsName);
glNormalPointer(GL_FLOAT, 0, 0);
ColorRGBA color = mat.ambientColor;
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat *)&color);
color = mat.diffuseColor;
if(alpha)
glColor4f(color.red, color.green, color.blue, mat.disolve);
else
glColor4f(color.red, color.green, color.blue, color.alpha);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (GLfloat *)&color);
color = mat.specularColor;
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat *)&color);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat.shine);
// load (if necessary) and bind the texture
if(group.textureCoordinatesIndexData.length > 0)
{
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
GLuint textureCoordsName = [group textureCoordinatesName:GL_STATIC_DRAW];
glEnable(GL_TEXTURE_2D);
glBindBuffer(GL_ARRAY_BUFFER, textureCoordsName);
glTexCoordPointer([group texCoordSize], GL_FLOAT, 0, 0);
GLuint texId = [mat.diffuseTexture textureName];
glBindTexture(GL_TEXTURE_2D, texId);
}
GLuint indexesName = [group indexesName:GL_STATIC_DRAW];
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexesName);
glDrawElements(GL_TRIANGLES, group.indexCount, GL_UNSIGNED_SHORT, NULL);
//^^This line above is where I get the "EXC_BAD_ACCESS" message
if(group.textureCoordinatesIndexData.length > 0)
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
适应我检查group.indexCount
通过断点和的NSLog的,它不为空,它是完全一样的在运行时为通过第一次工作正常。
我知道这并不一定是在该行,我听说其他谈论它是由于不被初始化为指针变量 - *
- 或没有匹配的标识符NSString的和值(@"%@ sometext %@", variable);
但我不看到我的代码中的任何一个,当然我可以很容易地错过一个。
我在想你应该修正这个错误,而不是使用像这样的黑客会得到你的拒绝。 – 2012-07-17 11:37:53
该应用程序不会提交给商店,它仅供个人使用,所以无需担心。任何其他想法? – 2012-07-17 11:39:34
理查德说什么。看起来您的错误的地方很可能是您在完成OpenGLES绘图并返回到开始屏幕后没有正确清理。 – 2012-07-17 11:42:54