Как управлять памятью / использованием NSMutableArray NSMutableArrays - PullRequest
2 голосов
/ 02 июня 2011

В настоящее время я пытаюсь написать класс для создания системы искусственных сеток, чтобы отслеживать NSMutableArray игровых объектов, используя NSMutableArray NSMutableArrays.Учитывая мой ограниченный опыт программирования на 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 - это NSMutableArray, содержащий GameEntities, которые я хочу отслеживать, которые передаются в этот класс.

Все размеры и количество сущностей для хранения являются фиксированными, поэтому нетпроверяет размеры массивов и количество сущностей для хранения.

Итак, первый вопрос, который у меня есть, касается освобождения памяти.Это функция dealloc, которая у меня есть на данный момент:

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

Вызывает ли выпуск релиза из ballList вызов релиза для содержащихся в нем NSMutableArrays (который впоследствии вызовет релиз для объектов, содержащихся в NSMutableArrays)или я должен написать что-то вроде:

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 или исходный aList, передаваемый в ballListизменить также?Если содержимое исходного списка aList не изменится, как бы я написал его так, чтобы они изменились?

Если у людей есть предложения по улучшению способа отслеживания сущностей в сетке, я быоткрыт для тех, кто тоже.Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2011

Первый: Одного выпуска достаточно для NSMutableArray экземпляра, чтобы освободить всего своего объекта.

    [ballList release];

Second: Ваш код для обновления GameEntity экземпляр в порядке и будет действовать на исходный aList (который вы вызвали).

0 голосов
/ 02 июня 2011
  1. Когда вызывается dealloc из NSArray или NSMutableArray, все его содержимое получает сообщение release.Поэтому, когда вы выпускаете ballList, если там нет другого владельца (я думаю, в этом случае его нет), то вызывается его dealloc, и вам не нужно освобождать другие массивы здесь.

  2. Ваш обход цикла в порядке.Хотя для двумерных массивов вместо NSArray из NSArray лично я предпочитаю чистый массив 2D C, по крайней мере, в большинстве случаев.добавляем ссылку в массив.Таким образом, любое изменение через ссылку на массив будет отражено во всех ссылках объекта.Если вы не хотите этого, то добавьте copy объекта в массив.

...