我有一些代码,我遍历一个数组。我正在添加第二个可变数组,以便我可以添加对象,我想在迭代完成后删除它。但是,当我尝试将对象添加到我创建的第二个数组时,这会导致错误的访问错误。这让我很困惑,因为我想要添加的对象可以用于所有类型的事情,只是不添加到这个数组。这让我相信阵列可能会被释放,所以我保留了它,但这没有效果。这是代码:
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
答案 0 :(得分:2)
NSMutableArray *objectsToRemove = [ NSMutableArray array ];
for ( NSDictionary *object in [ objectGroup objects ] ) {
[ objectsToRemove addObject: object ]; // crash occurs here
如果崩溃发生在那里,则它与objectsToRemove
无关(除非有代码未显示)。
这意味着object
是bunko。可能,它已经从objectGroup
下面发布了。打开Zombie检测并重新运行您的应用程序。
注意:当你是新手时调试这些东西可能会令人生畏。一些提示:
•如果您正在盯着汇编代码,您几乎肯定会在杂草中消失。
•如果你在基金会框架方法中崩溃,那么几乎可以肯定这个bug在其他地方是因为这些方法被执行了数亿次来启动你的Mac或你的iOS设备。假设他们工作是一个安全的赌注。
答案 1 :(得分:0)
事实证明问题在于NSMutableArray初始化。我正在使用:
NSMutableArray *objectsToRemove = [ NSMutableArray array ];
应该是:
NSMutableArray *objectsToRemove = [ NSMutableArray arrayWithCapacity: 10 ];