我目前正在尝试编写一个类来创建虚假网格系统,以使用NSMutableArray的NSMutableArrays跟踪游戏实体的NSMutableArray。鉴于我对Objective-C编程的经验有限,我不确定某些事情是如何运作的。
这是init方法:
#define MAX_BALL_ROWCOUNT 6
#define MAX_BALL_COLCOUNT 4
- (id) initWithMutableArray:(NSMutableArray *)aList {
self = [super init];
if (self != nil) {
ballList = [[NSMutableArray alloc] initWithCapacity: MAX_BALL_ROWCOUNT];
for (int i=0; i<MAX_BALL_ROWCOUNT; i++) {
NSMutableArray *balls = [[NSMutableArray alloc] initWithCapacity:MAX_BALL_COLCOUNT];
[ballList addObject:balls];
[balls release];
}
int x = 0;
for (NSMutableArray *array in ballList) {
for (int i = 0; i<MAX_BALL_COLCOUNT; i++) {
[array addObject:[aList objectAtIndex:x]];
x++;
}
}
}
return self;
}
ballList是类的NSMutableArray,它将存储NSMutableArrays。
aList是NSMutableArray,其中包含我希望跟踪传递到此类的GameEntities。
要存储的实体的所有大小和数量都是固定的,这就是为什么不检查数组的大小以及要存储的实体数量。
所以我的第一个问题涉及释放记忆。这是我目前拥有的dealloc功能:
- (void) dealloc {
[ballList release];
[super dealloc];
}
调用ballList上的发布会导致在它包含的NSMutableArrays上调用发布(随后会调用NSMutableArrays包含的对象上的发行版),或者我必须编写类似的内容:
for (NSMutableArray *array in ballList) {
[array release];
}
[ballList release];
我的第二个问题涉及这个数组数组的使用。这是遍历ballList的正确方法吗?
- (void) update {
for (NSMutableArray *array in ballList) {
for (GameEntity *balls in array) {
(CGPoint) location = [balls getLocation];
[balls setLocation: CGPointMake(location.x+1, location.y+1)];
}
}
}
最后,在上面设置球位置的代码中,它是否只影响ballList中的内容,还是传递给ballList的原始aList也会发生变化?如果原始aList中的内容没有改变,我该如何编写它们呢?
如果有人建议更好地跟踪网格系统中的实体,我也会对这些实体持开放态度。提前谢谢。
答案 0 :(得分:1)
首先: NSMutableArray
个实例的版本足够,以释放所有对象。
[ballList release];
第二:您更新 GameEntity 实例的代码很好,也会影响原来的 aList (您调用的)。
答案 1 :(得分:0)
当调用dealloc
或NSArray
的{{1}}时,其所有内容都会收到NSMutableArray
条消息。因此,当您释放release
时,如果没有其他所有者(我猜在这种情况下没有),则调用其ballList
并且您不需要在此处释放其他数组。
您的循环遍历很好。虽然对于2D数组而不是dealloc
NSArray
我个人更喜欢纯C 2D数组,至少在大多数情况下都是如此。
以这种方式添加对象时,您将在数组中添加引用。因此,通过数组引用的任何更改都将反映在对象的所有引用中。如果您不想这样,那么在数组中添加NSArray
对象。