2012-07-17 32 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