Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 向C阵列中的NSMutableArray发送消息时出现问题_Objective C_Nsmutablearray_Exc Bad Access_Arrays - Fatal编程技术网

Objective c 向C阵列中的NSMutableArray发送消息时出现问题

Objective c 向C阵列中的NSMutableArray发送消息时出现问题,objective-c,nsmutablearray,exc-bad-access,arrays,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] = [[NSMut

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

我有一个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];
        }
    }
[poolArray[x][y] addObject:object]; //This raises a EXC_BAD_ACCESS error
if (poolArray[x][y] == nil) poolArray[x][y] = [[NSMutableArray alloc] init];
[poolArray[x][y] addObject:object];
我完全愿意编辑我写这篇文章的方式——我知道我可以声明一个NSMutableArray并使用((y*width)+x)的索引,我可能需要像这样重新编写代码。但最好我不想这样做,因为我只想实际创建我正在使用的阵列,比如:

    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[x][y] addObject:object]; //This raises a EXC_BAD_ACCESS error
if (poolArray[x][y] == nil) poolArray[x][y] = [[NSMutableArray alloc] init];
[poolArray[x][y] addObject:object];
这是因为它可以有“洞”,所以我不必在poolArray[2][3]上做任何事情,例如,如果那里什么都没有

我不知道我是否可以用objective-c类型重写它,但是如果我这样做了,我不得不在每个空间都创建一个NSMutableArray,我不想这样做的原因是因为我想从系统中获得我能获得的每一点性能

感谢您抽出时间阅读本文,并感谢您的回复:)

这对我很有用:

#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;
}
#导入
#定义xSize 10
#定义尺寸10
int main(int argc,const char*argv[]
{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSMutableArray*poolArray[xSize][ySize];
对于(int n=0;n
(是的,我知道,我应该发布所有NSMutableArray实例。为了简洁起见,请忽略)

因此,您应该检查以下几点:

  • object
    是否为有效对象,即是否已初始化?
    NSMutableArray
    将尝试
    保留
    对象,如果它从未初始化过,那么将失败得很惨,或者如果它已经被
    解除锁定
    -ed,它也将失败
  • x
    y
    有效吗?你可以轻易地越过边界而不去注意它

您所提供的代码没有任何错误,尽管有以下几个想法:

在检查池数组[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];

对,我在调试器中逐步完成了所有代码,因为所有大小都是在运行时计算的,xSize和ySize是2。当通过生成x和y的循环时,它们是:1,1,0,0,1,0,所以它们都不是不正确的值,除非我弄错了,并且对象来自我游戏中的对象,我知道它初始化为没有此代码,它运行并呈现ect良好,当我这样做时,虽然代码执行正确,但当它到达自动释放池释放方法时崩溃,那么您可能过度释放(或保留不足)您正在使用的一个或多个对象。或者,更可能的是,您或其他人自动释放了您的对象。这意味着它将运行一段时间,直到您遇到释放池排水或释放。只需将其保留在您获得的位置,并在适当的时间释放即可。将对象设置为nil可使其正常工作!当我这样做时,它也会在释放自动释放池时崩溃,但我确实在某个地方读到,当您不保留对象时(就像我对NSMutableArray所做的那样),它会自动释放,但是我在我的方法结束时发布了它,我猜它崩溃的原因是他试图释放一个不存在的对象!谢谢你的帮助,我的系统仍然有一些问题,因为它无法识别冲突,但我很确定这是代码中其他地方的问题,因为它现在没有崩溃!