【问题标题】:How to manage memory/usage of a NSMutableArray of NSMutableArrays如何从 NSMutableArray 管理 NSMutableArray 的内存/使用情况
【发布时间】:2011-06-02 04:44:08
【问题描述】:

我目前正在尝试编写一个类来创建人造网格系统,以使用 NSMutableArrays 的 NSMutableArray 跟踪游戏实体的 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 是包含我希望跟踪的 GameEntities 的 NSMutableArray,它被传递到此类中。

要存储的所有实体的大小和数量都是固定的,这就是为什么不检查数组的大小和要存储的实体数量的原因。

所以我的第一个问题涉及释放内存。这是我目前拥有的 dealloc 函数:

- (void) dealloc {
    [ballList release];
    [super dealloc];
}

在 ballList 上调用 release 是否会导致在其包含的 NSMutableArrays 上调用 release(随后将在 NSMutableArrays 包含的对象上调用 release)还是我必须编写如下内容:

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中的内容没有改变,我将如何编写它?

如果人们有更好的方法来跟踪网格系统中的实体,我也愿意接受。提前致谢。

【问题讨论】:

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


    【解决方案1】:

    第一:一个释放就足够了NSMutableArray实例释放它的所有对象。

        [ballList release];
    

    第二:您更新GameEntity实例的代码很好,也会影响到原来的aList(你叫它)。 p>

    【讨论】:

      【解决方案2】:
      1. 当调用NSArrayNSMutableArraydealloc 时,其所有内容都会收到release 消息。所以当你释放ballList 时,如果没有其他所有者(我猜在这种情况下没有),那么它的dealloc 会被调用,你不需要在这里释放其他数组。

      2. 您的循环遍历很好。尽管对于 2D 数组而不是 NSArrayNSArray,我个人更喜欢纯 C 2D 数组,至少在大多数情况下是这样。

      3. 当您以这种方式添加对象时,您将在数组中添加一个引用。因此,通过数组引用的任何更改都将反映在对象的所有引用中。如果您不希望这样,请在数组中添加对象的copy

      【讨论】:

      • @Jeff Lee,如果任何答案对您有帮助,请使用投票并接受解决您问题的答案。详情请查看常见问题解答stackoverflow.com/faq
      • 在这一点上,他似乎没有足够的代表来投票。不过,他应该接受。
      猜你喜欢
      • 2011-09-06
      • 2010-10-02
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2011-10-13
      相关资源
      最近更新 更多