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

保持カウントが 0 ではないため、BulletEnemy 内の dealloc メソッドが呼び出されません。なぜですか? しかし、(enemyBullets を解放する) ACLass を解放すると、弾丸の割り当てが解除されます。

4

2 に答える 2

0

EnemyにenemyBulletsを所有させます。そして、reverseObjectEnumeratorを使用します

// 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];
}
于 2012-05-04T19:14:17.160 に答える
0

明らかに、retain プロパティを使用して何かを割り当てていたため、オブジェクトが +1 になり、割り当てが解除されませんでした。割り当てるプロパティを変更しただけで機能しました。

于 2012-10-29T14:22:24.003 に答える