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