iOS可变阵列释放行为

iOS可变阵列释放行为,ios,objective-c,memory-management,nsmutablearray,Ios,Objective C,Memory Management,Nsmutablearray,我对NSMutableArrayalloc和release有问题。见以下代码: NSMutableArray *enemiesToDeleteArray = [NSMutableArray arrayWithCapacity:5]; ... else if ([enemy isActive] && !CGRectIntersectsRect(fieldOfView, enemyRect)) { [enemiesToDeleteArray a

我对
NSMutableArray
alloc和release有问题。见以下代码:

NSMutableArray *enemiesToDeleteArray = [NSMutableArray arrayWithCapacity:5];
...
else if ([enemy isActive] && !CGRectIntersectsRect(fieldOfView, enemyRect))
        {
            [enemiesToDeleteArray addObject:enemy];
        }
...
 [enemiesToDeleteArray removeAllObjects];
 [enemiesToDeleteArray release];
以上代码在运行中崩溃。带有符号调试中断错误“objc_release”或“malloc_break_error”。在下面,我添加了发生objc_释放错误时的回溯:

* thread #1: tid = 0x1c03, 0x01e140a5 libobjc.A.dylib`objc_release + 21, stop reason = EXC_BAD_ACCESS (code=1, address=0xa0020010)
    frame #0: 0x01e140a5 libobjc.A.dylib`objc_release + 21
    frame #1: 0x01e14bd9 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 555
    frame #2: 0x023c6468 CoreFoundation`_CFAutoreleasePoolPop + 24
    frame #3: 0x002effc1 QuartzCore`CA::AutoreleasePool::~AutoreleasePool() + 19
    frame #4: 0x002ff35f QuartzCore`CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) + 251
    frame #5: 0x002ff75f QuartzCore`CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*) + 161
    frame #6: 0x023e3376 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    frame #7: 0x023e2e06 CoreFoundation`__CFRunLoopDoTimer + 534
    frame #8: 0x023caa82 CoreFoundation`__CFRunLoopRun + 1810
    frame #9: 0x023c9f44 CoreFoundation`CFRunLoopRunSpecific + 276
    frame #10: 0x023c9e1b CoreFoundation`CFRunLoopRunInMode + 123
    frame #11: 0x0312b7e3 GraphicsServices`GSEventRunModal + 88
    frame #12: 0x0312b668 GraphicsServices`GSEventRun + 104
    frame #13: 0x009d0ffc UIKit`UIApplicationMain + 1211
    frame #14: 0x000c81f6 MyAPP`main(argc=1, argv=0xbffff36c) + 134 at main.m:14
    frame #15: 0x00001fa5 MyAPP`start + 53
以及malloc_break_错误的回溯:

MyAPP(18609,0xac98ea28) malloc: *** error for object 0x112dee40: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

(lldb) bt
    * thread #1: tid = 0x1c03, 0x97be7815 libsystem_c.dylib`malloc_error_break, stop reason = breakpoint 1.1
        frame #0: 0x97be7815 libsystem_c.dylib`malloc_error_break
        frame #1: 0x97be8d51 libsystem_c.dylib`free + 346
        frame #2: 0x023c5ea4 CoreFoundation`-[__NSArrayM dealloc] + 276
        frame #3: 0x01e159ff libobjc.A.dylib`-[NSObject release] + 47
        frame #4: 0x01e140d5 libobjc.A.dylib`objc_release + 69
        frame #5: 0x01e14bd9 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 555
        frame #6: 0x023c6468 CoreFoundation`_CFAutoreleasePoolPop + 24
        frame #7: 0x002effc1 QuartzCore`CA::AutoreleasePool::~AutoreleasePool() + 19
        frame #8: 0x002ff35f QuartzCore`CA::Display::DisplayLink::dispatch(unsigned long long, unsigned long long) + 251
        frame #9: 0x002ff75f QuartzCore`CA::Display::TimerDisplayLink::callback(__CFRunLoopTimer*, void*) + 161
        frame #10: 0x023e3376 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
        frame #11: 0x023e2e06 CoreFoundation`__CFRunLoopDoTimer + 534
        frame #12: 0x023caa82 CoreFoundation`__CFRunLoopRun + 1810
        frame #13: 0x023c9f44 CoreFoundation`CFRunLoopRunSpecific + 276
        frame #14: 0x023c9e1b CoreFoundation`CFRunLoopRunInMode + 123
        frame #15: 0x0312b7e3 GraphicsServices`GSEventRunModal + 88
        frame #16: 0x0312b668 GraphicsServices`GSEventRun + 104
        frame #17: 0x009d0ffc UIKit`UIApplicationMain + 1211
        frame #18: 0x000c81f6 MyAPP`main(argc=1, argv=0xbffff36c) + 134 at main.m:14
        frame #19: 0x00001fa5 MyAPP`start + 53

请向我解释一下,我做错了什么?

您根本不应该发布
enemiesToDeleteArray
。它将在当前范围结束时自动释放。您根本没有使用
alloc
,因此此对象是自动管理的

您根本不应该释放
enemiesToDeleteArray
。它将在当前范围结束时自动释放。您根本没有使用
alloc
,因此此对象是自动管理的

NSMutableArray*enemiestodelearray=[NSMutableArray阵列容量:5]
返回一个自动释放的实例,该实例在离开初始值设定项一段时间后被清除。现在,指针enemiesToDeleteArray指向未定义的内存。您需要执行以下操作:

enemiesToDeleteArray = [[NSMutableArray arrayWithCapacity:5] retain];


NSMutableArray*enemiestodelearray=[NSMutableArray阵列容量:5]
返回一个自动释放的实例,该实例在离开初始值设定项一段时间后被清除。现在,指针enemiesToDeleteArray指向未定义的内存。您需要执行以下操作:

enemiesToDeleteArray = [[NSMutableArray arrayWithCapacity:5] retain];



但是为什么呢?我的意思是,在数组的分配中没有给定自动释放的属性。您是
new
alloc
retain
、还是
copy
NSMutableArray
?不那就不要释放它!始终记住,
release
NARC
之后。但是为什么呢?我的意思是,在数组的分配中没有给定自动释放的属性。您是
new
alloc
retain
、还是
copy
NSMutableArray
?不那就不要释放它!始终记住,
release
是在
NARC
之后发布的。不是一段时间之后。CS是一门科学,我们以后不会有魔法。事实上,我们是用自动释放来实现的。从该方法的范围来看,系统调用
发布
的时间未知。同意。从这个方法的角度来看,它只能假设“比我的返回晚一点”。这正是我们应该考虑的。@JonathanGrynspan它被标记为有资格在当前范围结束时被垃圾收集。如果清除池,它将以完全受控的方式发生。@bioffe自动释放池实际上是一个位于集合堆栈顶部的可变计数对象集。创建池时,会在堆栈上推送一个新集合。销毁池时,将删除顶部集,其中的所有内容(通过发送
-autorelease
)将在每次计数时发送一次
-release
。CS是一门科学,我们以后不会有魔法。事实上,我们是用自动释放来实现的。从该方法的范围来看,系统调用
发布
的时间未知。同意。从这个方法的角度来看,它只能假设“比我的返回晚一点”。这正是我们应该考虑的。@JonathanGrynspan它被标记为有资格在当前范围结束时被垃圾收集。如果清除池,它将以完全受控的方式发生。@bioffe自动释放池实际上是一个位于集合堆栈顶部的可变计数对象集。创建池时,会在堆栈上推送一个新集合。销毁池时,顶层集将被删除,其中的所有内容(通过发送
-autorelease
)将在每次计数时发送
-release
。正如其他人所指出的,只需删除对
release
的调用即可。您还可以删除对
removeAllObjects
--
NSMutableArray
实例的调用。在释放过程中,实例会自动处理该调用。正如其他人所指出的,只需删除对
release
的调用即可。您还可以删除对
removeAllObjects
--
NSMutableArray
实例的调用,在释放过程中自动处理该调用。