2012-07-17 40 views
0

在我最新的应用程序中遇到了一些令人沮丧的问题!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);但我不看到我的代码中的任何一个,当然我可以很容易地错过一个。

+2

我在想你应该修正这个错误,而不是使用像这样的黑客会得到你的拒绝。 – 2012-07-17 11:37:53

+0

该应用程序不会提交给商店,它仅供个人使用,所以无需担心。任何其他想法? – 2012-07-17 11:39:34

+0

理查德说什么。看起来您的错误的地方很可能是您在完成OpenGLES绘图并返回到开始屏幕后没有正确清理。 – 2012-07-17 11:42:54

回答

0

记住两件事情:

1)你在你家的ViewController的方法-(void)viewWillAppear:(BOOL)animated。这会在用户返回到这个屏幕时调用always(!)(不像viewDidLoad)。 2)如果你甚至像你描述的那样做你可能没有去AppStore!

0

我不知道为什么你的应用程序不能在模拟器上编译,但你应该尝试适当地链接你的库,这样你就可以启动并运行 - 没有什么比僵尸更好的访问错误。

如果您知道您的错误来自glDrawElements,那么您应该查看传递给它的内容。 This link可能会帮助你。

因为它不在应用程序中,所以无法获取退出应用程序的“功能”是因为它不是应用程序的功能 - 这是操作系统丢弃与应用程序相关的所有内容,然后重新加载它。根据定义,如果不实际关闭,你将无法做到这一点。

但是,如果你的问题被这个问题解决了,那么很可能你的设置中有些东西需要重做(初始化,声明等)。检查设置为nil的设置或丢弃,然后重新设置。

不看你的代码我不能确定地说这个,但你也许可以写一个覆盖/重新初始化所有当前变量的方法。这可能会复制退出所需应用程序的部分。

+0

感谢您的回复!我的项目不会在模拟器上编译,因为它需要相机(相当重要,我简化了上面的解释,仅涉及问题的主要部分) – 2012-07-17 13:25:56