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


// 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];

现在在敌人内部的某个时间点,我执行以下操作:

// 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];

问题是当我在 Aclass 执行以下操作时:

[enemyBullets removeObjectsInArray:bulletsToDelete];

不会调用 BulletEnemy 中的 dealloc 方法,因为保留计数不为 0。为什么?但是如果我释放ACLass(释放敌人子弹),那么我的子弹就会被释放。

让敌人拥有敌人子弹。并使用反向对象枚举器

// 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];
}

当然,我正在用保留属性签名一些东西,这使得对象 +1 因此不会解除分配。只是更改了要分配的属性,它起作用了。

最新更新