如何管理NSMutableArray的内存/使用到NSMutableArray

时间:2011-06-02 04:44:09

标签: objective-c memory-management multidimensional-array nsmutablearray storage

我目前正在尝试编写一个类来创建虚假网格系统,以使用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中的内容没有改变,我该如何编写它们呢?

如果有人建议更好地跟踪网格系统中的实体,我也会对这些实体持开放态度。提前谢谢。

2 个答案:

答案 0 :(得分:1)

首先: NSMutableArray个实例的版本足够,以释放所有对象。

    [ballList release];

第二:您更新 GameEntity 实例的代码很好,也会影响原来的 aList (您调用的)。

答案 1 :(得分:0)

  1. 当调用deallocNSArray的{​​{1}}时,其所有内容都会收到NSMutableArray条消息。因此,当您释放release时,如果没有其他所有者(我猜在这种情况下没有),则调用其ballList并且您不需要在此处释放其他数组。

  2. 您的循环遍历很好。虽然对于2D数组而不是dealloc NSArray我个人更喜欢纯C 2D数组,至少在大多数情况下都是如此。

  3. 以这种方式添加对象时,您将在数组中添加引用。因此,通过数组引用的任何更改都将反映在对象的所有引用中。如果您不想这样,那么在数组中添加NSArray对象。