Objective-c数组在删除时未解除对象分配

Objective-c数组在删除时未解除对象分配,objective-c,Objective C,现在,在某个时间点,我将执行以下操作: // AClass.m // init enemyBullets = [[NSMutableArray alloc] initWithCapacity:0]; enemy1 = [[Enemy alloc] initWithBullets:enemyBullets]; // At some point NSMutableArray *bulletsToDelete = [NSMutableArray array]; for(BulletEnemy *th

现在,在某个时间点,我将执行以下操作:

// AClass.m
// init
enemyBullets = [[NSMutableArray alloc] initWithCapacity:0];
enemy1 = [[Enemy alloc] initWithBullets:enemyBullets];

// At some point
NSMutableArray *bulletsToDelete = [NSMutableArray array];
for(BulletEnemy *thisBullet in enemyBullets)
{
    // If I have to delete
    [bulletsToDelete addObject: thisBullet];
}
[enemyBullets removeObjectsInArray:bulletsToDelete];

//dealloc method
[enemyBullets release];
[enemy1 release];
问题在于我在Aclass上执行以下操作时:

// Enemy.m
- (id)initWithBullets:(NSMutableArray*) _bullets{
     // Enemybullets is a var of Enemy
     enemyBullets = _bullets;
}

// At some point...
myBullet = [[BulletEnemy alloc] init];
[enemyBullets addObject:myBullet];
[myBullet release];

无法调用BulletToken中的dealloc方法,因为保留计数不是0。为什么?但是,如果我释放了一个释放enemyBullets的类,那么我的子弹就会被释放。

让敌人拥有enemyBullets。并使用reverseObjectEnumerator

[enemyBullets removeObjectsInArray:bulletsToDelete];

不幸的是,我正在使用retain属性设计一些东西,这使得对象+1无法解除分配。刚刚将属性更改为assign,它就工作了。

为什么敌人不保留EnemyBullets阵列?您似乎没有遵循标准的内存管理实践。您的代码在某些方面非常奇怪。如果要有选择地从数组中删除内容,请构建一个NSMutableIndexSet,其中包含不需要的对象的索引,然后使用-RemoveObjectsIndexes:。或者只需执行反向枚举并立即从数组中删除对象。@trojanfoe,我必须保留它吗?enemyBullets=[[u bullets retain]要清除,当我释放一个释放enemyBullets的Aclass时,会调用dealloc。首先,我要说的是[bullets init]应该创建子弹数组,然后你可以将readonly正确添加到敌方类中,以便其他对象可以访问该数组并添加到该数组中。我不清楚为什么敌人拥有这些子弹;他们不是同时出现在屏幕上的兄弟对象吗?敌人拥有敌人的子弹,所以我可以创建并将敌人的子弹添加到阵列中。这是一个管理敌人子弹的班级。什么?不,我没有把子弹留在任何地方。换成这样,会发生同样的事情吗?对于BulletFor*enemyBullets.reverseObjectEnumerator{[enemyBullets removeObject:thisBullet];}中的此Bullet,或者是否对myBullet的任何点使用块?可以按块保留。不,没有块。尝试使用reverseObjectEnumerator,但当我从enemyBullets中删除项目符号时,仍然没有解除锁定项目符号。代码显示AClass拥有enemyBullets,因为它不释放,并且在解除锁定时释放。
// AClass.m
// init
enemy1 = [[Enemy alloc] init];

// At some point
for(BulletEnemy *thisBullet in enemy1.enemyBullets.reverseObjectEnumerator)
{
    // If I have to delete
    [enemy1.enemyBullets removeObject:thisBullet];
}

//dealloc method
[enemy1 release];

//Enemy.h
@property (retain) NSMutableArray* enemyBullets;


// Enemy.m
@synthesize enemyBullets = _enemyBullets;

- (id)init{
     // Enemybullets is a var of Enemy
     _enemyBullets = [[NSMutableArray alloc] init];
}

// At some point...
myBullet = [[BulletEnemy alloc] init];
[enemyBullets addObject:myBullet];
[myBullet release];

-(void) dealloc{
    [_enemyBullets release];
}