2010-09-06 95 views
3

我查了所有在我的代碼,並不能找到這崩潰之源: 我試圖解碼與NSKeyedUnarchiver一個對象,它在它的每一次崩潰,並說:Objc內存崩潰與autorelase

*** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008ad200) ignored 
*** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008ab200) ignored 
*** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008a8c00) ignored 

哈我不好意思爲什麼initWithCoder沒有被調用是因爲它有問題[super initWithCoder:];這仍然讓我發瘋。我一看,指針和NSData的對象是什麼走錯了:

vertices = malloc(size_point3D * vertexCount); 
    textureCoords = malloc(size_point2D * textureCount); 
    normals = malloc(size_point3D * normalCount); 
    faces = malloc(sizeof(GLuint) * faceCount); 


    NSData *vertexData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"vertices"]]; 
    NSData *textureData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"textureCoords"]]; 
    NSData *normalData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"normals"]]; 
    NSData *faceData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"faces"]]; 


    memcpy(vertices, [vertexData bytes], sizeof(point3D) * vertexCount); 
    memcpy(textureCoords, [textureData bytes], sizeof(point2D) * textureCount); 
    memcpy(normals, [normalData bytes], sizeof(point3D) * normalCount); 
    memcpy(faces, [faceData bytes], sizeof(GLuint) * faceCount); 

    [vertexData release]; 
    [textureData release]; 
    [normalData release]; 
    [faceData release]; 

我試圖保留這部分(甚至是字符串)的一切,但它並不能幫助。

+0

你可以張貼一些代碼? – 2010-09-06 03:56:21

+0

嗯,但它是一個非常深的堆棧 – 2010-09-06 04:05:47

+0

它看起來像你正在重新定義模型。路徑是伊娃嗎?我認爲步驟1將確切地找出哪個對象試圖獲得兩次釋放。有點棘手,只有很少的代碼可以繼續。 – taber 2010-09-06 04:39:53

回答

2

這是一個很難解決部分是因爲調試內存不一致的行爲。

我有2個班JGStaticModelJGModel。出於某種原因,unarchiver會隨機選擇其中一個,所以有時initWithCoder被髮送到JGModel而不是JGStaticModel。這導致我認爲它沒有被調用。此外,由於它們的結構略有不同,因此存在問題並墜毀。之所以出現autorelease問題,是因爲我在JGStaticModel中修補了一些內存問題,但不是JGModel,所以它會在內存上崩潰,因爲我沒有修復它。

感謝您的幫助!

1

嘗試啓用NSZombieEnabled,這會幫助你追蹤問題。

+0

我已經試過了。 – 2010-09-06 04:01:22

0

如果沒有工具(運行 - >與性能工具運行)和NSZombiesEnabled幫助,你可以重寫 - (ID)保留和 - 導致異常的類(無效)的釋放方法。調用超級實現和日誌保留/釋放。您可以使用此方法來查看調用堆棧。這種方式是不漂亮,但它幫助我一些時間來找出了一個額外的發佈/自動釋放呼叫

0

這個問題很容易給出here的解決方案來解決。

相關部分是:

如果設置與字符串值命名爲「NSAutoreleaseHaltOnFreedObject」環境變量「YES」,該功能會自動在調試器打破