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