Objective-c释放C-Array中的对象

时间:2012-04-22 21:48:20

标签: objective-c arrays

我有:

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方法。顺便说一句,我不想​​使用自动释放。我该怎么办?

2 个答案:

答案 0 :(得分: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]

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

请注意,如果您在ARC环境中工作,则无法使用。

答案 1 :(得分: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不在EnemyUpdate协议中且类型为id<EnemyUpdate>。您可以将数组声明为NSObject<EnemyUpdate>* enemies[6][10];

指定EnemyUpdate采用@protocol NSObject

@protocol EnemyUpdate < NSObject >
...
@end