0

我有:

id<EnemyUpdate> enemies[6][10];

我使用以下方法初始化我的自定义类:

// init
enemies[row][col] = [[MyenemyClass alloc]init];
//..

-(void) dealloc{
     [super dealloc]
      // I want to release the 2d array here
}

现在,我以后如何(在 dealloc 方法中)在二维数组中释放我的对象?通过调用 free(enemies[row][col]) 不会进入类中的 dealloc 方法。顺便说一句,我不想​​使用自动释放。我该怎么做?

4

2 回答 2

1

您应该遍历它们并一一释放它们:

for (int i = 0; i < 6; ++i)
  for (int j = 0; j < 10; ++j)
    [enemies[i][j] release];

free(enemies);

请记住,autorelease在这种情况下不得使用:由于对象存储在非托管对象(C 数组)中,因此自动释放将导致僵尸对象,因为没有其他人保留该对象。我的意思是你不能做

[[[MyenemyClass alloc]init] autorelease]

就像您在将项目添加到 an 时通常所做的那样,NSMutableArray因为在 C 数组中设置托管对象时没有保留计数增加,因此对象将被释放,但数组中的指针将继续指向垃圾,并且在您尝试时大多崩溃用它。

请注意,如果您在 ARC 环境中工作,这将不起作用。

于 2012-04-22T21:52:30.560 回答
1

像任何其他 objc 变量一样,您需要release数组的每个元素。此外,您应该在调用enemies[][] 之前[super dealloc]释放您的.

您的实现将采用以下形式:

- (void)dealloc
{
  for (size_t i = 0; i < 6; ++i) {
    for (size_t j = 0; j < 10; ++j) {
      [enemies[i][j] release];
      enemies[i][j] = nil;
    }
  }

  [super dealloc]
}

编辑

警告告诉我方法 -release 没有找到?

那是因为releaseis 不在EnemyUpdate协议中并且类型是id<EnemyUpdate>. 您可以将数组声明为NSObject<EnemyUpdate>* enemies[6][10];

或者

指定EnemyUpdate采用@protocol NSObject

@protocol EnemyUpdate < NSObject >
...
@end
于 2012-04-22T22:08:50.333 回答