Проблемы с отправкой сообщений в NSMutableArrays в C-Arrays - PullRequest
1 голос
/ 24 августа 2011

В настоящее время я пытаюсь внедрить систему пула, у меня есть весь код, я просто не понимаю, почему какая-то его часть не работает.

У меня есть c-массив массива NSMutableсделано следующим образом:

    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], например, если там ничего нет.

Я не знаю, есть ли что-нибудь, что я мог бы переписать это с типами target-c, но если я это сделаюЯ вынужден продолжать создавать NSMutableArray в каждом месте, причина, по которой я не хочу этого делать, заключается в том, что я хочу добиться максимальной отдачи от работы системы.

Спасибо, что нашли времячитать это, и любой ответ приветствуется:)

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

Это работает для меня:

#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 голос
/ 24 августа 2011

Не вижу ничего плохого в предоставленном вами коде, хотя есть пара идей:

В случае, когда ваш проверяющий 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];
...