Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-c在c-阵列中释放对象_Objective C_Arrays - Fatal编程技术网

Objective-c在c-阵列中释放对象

Objective-c在c-阵列中释放对象,objective-c,arrays,Objective C,Arrays,我有: id<EnemyUpdate> enemies[6][10]; 现在,我以后如何在二维数组中释放对象(在dealloc方法中)?通过调用free(敌人[row][col])不会在类中输入dealloc方法。顺便说一下,我不想使用自动释放。我该怎么做呢?您应该在它们上面循环并逐个释放它们: for (int i = 0; i < 6; ++i) for (int j = 0; j < 10; ++j) [enemies[i][j] release];

我有:

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

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

您应该在它们上面循环并逐个释放它们:

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

free(enemies);
与向
NSMutableArray
添加then项时的正常操作一样,因为在C数组中设置托管对象时,保留计数不会增加,所以对象会被释放,但数组中的指针会一直指向垃圾,并且在尝试使用它时会崩溃


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

与任何其他objc变量一样,您将
释放数组的每个元素。此外,在调用
[super dealoc]
之前,您应该释放您的
敌人[][]

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

- (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]
}

实际上我根本不使用ARC,但您的回答假设marcg确实自动释放,在这种情况下就可以了。整个最后一段没有意义。autorelease只是稍后发布。它可以精确地用于每个上下文版本。@marcg11:数组中的对象被声明为实现了EnemyUpdate协议。因此编译器只知道它们响应协议中声明的消息<代码>发布
在NSObject协议中声明。因此,除非EnemyUpdate协议符合NSObject,否则它不知道这些对象是否响应
发布
。同意Jack的回答,但我建议避免混合使用C和Objective-C对象。老实说,只需将其存储在
NSArray
实例中即可。当然,对于仅仅600个对象来说,性能不会有太大的提高。不管怎样,你都可以非常简单地模拟2D数组的行为;而且,几乎可以肯定的是,您也希望将敌人封装在自定义类中。警告告诉我找不到方法发布?请修改协议的定义,使其符合NSObect协议。然后警告将消失。
NSObject
协议,即。该死的iPad键盘…
[[[MyenemyClass alloc]init] autorelease]
- (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]
}
@protocol EnemyUpdate < NSObject >
...
@end