使用C-Arrays向NSMutableArray发送消息时出现问题

时间:2011-08-24 13:41:42

标签: objective-c nsmutablearray exc-bad-access arrays

我正在尝试实现一个池系统,我有所有代码,我只是不明白为什么它的某些部分不起作用。

我有一个像这样的NSMutable数组的c数组:

    NSMutableArray *poolArray[xSize][ySize];
    for (int n = 0; n < xSize; n++) 
    {
        for (int m = 0; m < ySize; m++)
        {
            poolArray[n][m] = [[NSMutableArray alloc] init];
        }
    }

在尝试访问它时,我得到了池的x和y坐标,并且对象就在这里,并尝试像这样添加它:

[poolArray[x][y] addObject:object]; //This raises a EXC_BAD_ACCESS error

我完全乐于编辑我的编写方式 - 我知道我可以声明一个NSMutableArray并使用((y * width)+ x)的索引,我可能必须像这样重写代码。但最好我不想这样做,因为我只想实际创建我正在使用的数组,所以像这样:

if (poolArray[x][y] == nil) poolArray[x][y] = [[NSMutableArray alloc] init];
[poolArray[x][y] addObject:object];

这样它可以有'漏洞'所以我不必在poolArray [2] [3]做任何事情,例如,如果那里什么也没有。

我不知道无论如何我都可以用objective-c类型重写它,但如果我这样做,我不得不在每个空间继续创建一个NSMutableArray,我不想这样做的原因是因为我希望能从系统中获得所有的一点性能。

感谢您抽出宝贵时间阅读本文,并感谢任何回复:)

2 个答案:

答案 0 :(得分:2)

这对我有用:

#import <Foundation/Foundation.h>

#define xSize 10
#define ySize 10

int main (int argc, const char * argv[])
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSMutableArray *poolArray[xSize][ySize];
    for (int n = 0; n < xSize; n++) 
    {
        for (int m = 0; m < ySize; m++)
        {
            poolArray[n][m] = [[NSMutableArray alloc] init];
        }
    }

    [poolArray[2][3] addObject: @"Hello"];
    [poolArray[2][3] addObject: @"world!"];
    NSLog(@"poolArray[2][3] objects: %@ %@", 
              [poolArray[2][3] objectAtIndex: 0],
              [poolArray[2][3] objectAtIndex: 1]);

    [pool drain];
    return 0;
}

(是的,我知道,我应该释放所有NSMutableArray实例。为了简洁而遗漏)

所以你应该检查一些事情:

  • object是否为有效对象,即是否已初始化? NSMutableArray将尝试retain该对象,如果它从未初始化,那将失败,或者如果它已经dealloc - 它也会失败。
  • xy有效吗?您可以轻松地超越界限而不会注意到它。

答案 1 :(得分:1)

虽然有一些想法,但看不出您提供的代码有什么问题:

如果您在检查poolArray [x] [y] == nil时实际上在初始化数组时将所有值重置为nil?

应该有效的替代方法是将数组存储在堆上。您可以使用calloc(将内存初始化为0)或malloc和memset。

以下内容应该有效:

NSMutableArray ***poolArray = calloc(xSize * ySize, sizeof(NSMutableArray *));

if (poolArray[x][y] == nil) poolArray[x][y] = [[NSMutableArray alloc] init];
[poolArray[x][y] addObject:object];