2013-01-13 83 views
2

我有一些代碼,我遍歷數組。我添加了第二個可變數組,以便我可以添加對象,我希望在迭代完成後將其刪除。但是,當我嘗試將對象添加到我創建的第二個數組時,這會導致訪問錯誤。這讓我感到困惑,因爲我想添加的對象可以用於所有類型的東西,只是不添加到這個數組中。這讓我相信,陣列可能會被釋放,所以我保留了它,但沒有任何效果。這裏是代碼:不明原因的壞訪問錯誤

CCTMXObjectGroup *objectGroup = [ self objectGroupNamed: @"object" ]; 
    NSMutableArray *objectsToRemove = [ NSMutableArray array ]; 
    for (NSDictionary *object in [ objectGroup objects ]) { 
     [ objectsToRemove addObject: object ]; // crash occurs here 
     // name, type, x, y, width, height 
     NSString *name = [ object valueForKey: @"name" ]; 
     if ([ name isEqualToString: @"sprite" ]) { 
      [ self createSpriteFromObject: object ]; 
     } else if ([ name isEqualToString: @"spriteController" ]) { 
      [ self createSpriteControllerFromObject: object ]; 
     } 
    } 

如果我刪除了addObject行,崩潰將不再發生。這裏是踢球者,這次撞擊似乎只發生在第6次迭代。單步執行代碼,添加到可變數組中,並且添加到它的對象似乎都很好(未發佈)。爲什麼錯誤的訪問錯誤呢?

編輯

CoreFoundation`-[__NSArrayM addObject:]: 
0x23c39e0: pushl %ebp 
0x23c39e1: movl %esp, %ebp 
0x23c39e3: pushl %edi 
0x23c39e4: pushl %esi 
0x23c39e5: subl $16, %esp 
0x23c39e8: calll 0x23c39ed     ; -[__NSArrayM addObject:] + 13 
0x23c39ed: popl %edi 
0x23c39ee: movl 1512267(%edi), %eax 
0x23c39f4: movl %eax, 4(%esp) 
0x23c39f8: movl 8(%ebp), %esi 
0x23c39fb: movl %esi, (%esp) 
0x23c39fe: calll 0x24e35c8     ; symbol stub for: objc_msgSend 
0x23c3a03: movl 1512287(%edi), %ecx 
0x23c3a09: movl %eax, 12(%esp) 
0x23c3a0d: movl 16(%ebp), %eax 
0x23c3a10: movl %eax, 8(%esp) 
0x23c3a14: movl %ecx, 4(%esp) 
0x23c3a18: movl %esi, (%esp) 
0x23c3a1b: calll 0x24e35c8     ; symbol stub for: objc_msgSend 
0x23c3a20: addl $16, %esp ; bad access code 2 
0x23c3a23: popl %esi 
0x23c3a24: popl %edi 
0x23c3a25: popl %ebp 
0x23c3a26: ret  
0x23c3a27: nopw (%eax,%eax) 

libsystem_sim_c.dylib`bzero$VARIANT$sse42: 
0x1f9c200: pushl %ebp 
0x1f9c201: movl %esp, %ebp 
0x1f9c203: pushl %edi 
0x1f9c204: movl 8(%ebp), %edi 
0x1f9c207: movl 12(%ebp), %edx 
0x1f9c20a: xorl %eax, %eax 
0x1f9c20c: cmpl $80, %edx 
0x1f9c20f: jg  0x1f9c24c     ; bzero$VARIANT$sse42 + 76 
0x1f9c211: cmpl $12, %edx 
0x1f9c214: jge 0x1f9c226     ; bzero$VARIANT$sse42 + 38 
0x1f9c216: testl %edx, %edx 
0x1f9c218: je  0x1f9c246     ; bzero$VARIANT$sse42 + 70 
0x1f9c21a: movb %al, (%edi) ; bad access code 2 
0x1f9c21c: incl %edi 
+1

你說「不明原因」,但我保證你有一個堆棧跟蹤和崩潰日誌。請張貼他們。 – sosborn

+0

@sosborn熊與我,我只有一個月左右,當談到objective-c。我在輸出記錄器中看不到任何東西。出現的堆棧軌跡從我在原始文章中提到的那一行作爲問題,到一些看起來不太明白的內部組件的怪異程序集。我已經將這些內容發佈到了上述文章的編輯中,並評論了訪問不當的行。 – dqhendricks

+0

objectGroupNamed:方法是什麼樣的? –

回答

2
NSMutableArray *objectsToRemove = [ NSMutableArray array ]; 
for (NSDictionary *object in [ objectGroup objects ]) { 
    [ objectsToRemove addObject: object ]; // crash occurs here 

如果崩潰發生在那裏,那麼就不能有任何與objectsToRemove做的(除非有代碼,你的避風港沒有顯示)。

這意味着object是文庫。可能它已經從objectGroup下發布。打開殭屍檢測並重新運行您的應用程序。

注:它可以是艱鉅的,當你是新來調試這個東西。一些提示:

•如果您在彙編代碼盯着,你幾乎肯定掉的雜草。

•如果在基礎框架方法崩潰,這是相當多保證了錯誤是在其他地方,因爲這些方法得到執行數以百萬計的時間來啓動你的Mac或iOS設備。假設他們工作是一個安全的賭注。

0

原來,問題與NSMutableArray的初始化奠定。我用的是:

NSMutableArray *objectsToRemove = [ NSMutableArray array ]; 

當它應該是:

NSMutableArray *objectsToRemove = [ NSMutableArray arrayWithCapacity: 10 ]; 
+3

這似乎不太可能。當你知道你的數組將包含多少個對象時,''arrayWithCapacity:'比'array'有一些小的性能優點。它不應該*以任何方式引起不同的行爲。 – omz

+0

@omz還沒有。 – dqhendricks