【发布时间】:2012-05-04 18:58:32
【问题描述】:
// 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 内部某个时间点我会执行以下操作:
// 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(它会释放enemyBullets),那么我的子弹就会被释放。
【问题讨论】:
-
为什么
Enemy不保留EnemyBullets数组?您似乎没有遵循标准的内存管理实践。 -
您的“在某些时候”位非常奇怪。如果您想有选择地从数组中删除内容,请构建一个包含您不想要的对象索引的
NSMutableIndexSet,然后使用-removeObjectsAtIndexes:。或者只是做一个反向枚举并立即从数组中删除对象。 -
@trojanfoe,我必须保留它吗?
enemyBullets = [_bullets retain]澄清一下,当我释放 Aclass 时会调用 dealloc,它释放了enemyBullets。 -
首先我想说
[Enemy init]应该创建子弹数组,然后您可以将readonly 正确添加到Enemy类中,以便其他对象可以访问该数组并添加到它。我不清楚为什么敌人拥有子弹。它们不是同胞对象都出现在屏幕上吗? -
Enemy 拥有enemybullets,因此我可以创建 BulletEnemy 并将其添加到数组中。管理enemyBullets的是AClass。
标签: objective-c