在我最新的應用程序中遇到了一些令人沮喪的問題!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