我正在尝试实现一个池系统,我有所有代码,我只是不明白为什么它的某些部分不起作用。
我有一个像这样的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,我不想这样做的原因是因为我希望能从系统中获得所有的一点性能。
感谢您抽出宝贵时间阅读本文,并感谢任何回复:)
答案 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
- 它也会失败。x
和y
有效吗?您可以轻松地超越界限而不会注意到它。答案 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];