2014-10-11 2 views
1

У меня есть класс QuantumClone, который имеет массив из CGPoint. Один объект QuantumPilot создает QuantumClone в начале каждого уровня. На следующем уровне QuantumPilot записывает свои скорости до QuantumClone. В начале нового уровня игровой цикл запускает этот кодКак освободить массивы стиля C?

QuantumClone *c = [[self.pilot clone] copy]; 
c.bulletDelegate = self; 
c.weapon = self.pilot.weapon; 
[self.clones addObject:c]; 

Но в конечном итоге игра будет обнулен, и каждый QuantumClone объект в клонах NSMutableArray будут удалены.

Я пропущу память, присвоив значения CGPoint pastVelocities[4551]?

Как их сбросить? Я не могу освободить их, поскольку они не являются объектами Objective-C. Мне нужно вызвать функции C для освобождения этой памяти?

@interface QuantumClone : QuantumPilot <NSCopying> { 
    CGPoint pastVelocities[4551]; 
} 

- (id)copyWithZone:(NSZone *)zone { 
    QuantumClone *c = [[[QuantumClone alloc] init] autorelease]; 
    c.weapon = self.weapon; 
    for (NSInteger i = 0; i < 4551; i++) { 
     [c recordVelocity:pastVelocities[i] firing:pastFireTimings[i]]; 
    } 
    [c recordLatestIndex:timeIndex]; 
    return c; 
} 

- (void)recordVelocity:(CGPoint)vel firing:(BOOL)firing { 
    CGPoint p = pastVelocities[timeIndex]; 
    p.x = vel.x; 
    p.y = vel.y; 
    pastVelocities[timeIndex] = p; 
    bool fired = firing; 
    pastFireTimings[timeIndex] = fired; 
    timeIndex++; 
} 

@interface QuantumPilot : CCNode {} 
.... 
@property (nonatomic, retain) QuantumClone *clone; 

- (void)copyDeltas { 
    [self.clone recordVelocity:ccp(self.vel.x, -self.vel.y) firing:self.firing]; 
} 

- (void)createClone { 
    self.clone = [[[QuantumClone alloc] init] autorelease]; 
    self.clone.active = YES; 
    self.clone.weapon = self.weapon; 
} 
+0

Комментарий к нисходящей линии? Я пытаюсь обеспечить, чтобы я не пропускал память, назначая этим CGPoints – quantumpotato

+0

Что такое CGPoint? –

+0

struct CGPoint { CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; в CoreGraphics/CGGeometry.h – quantumpotato

ответ

2

Am I утечки памяти, назначая значения в CGPoint pastVelocities[4551]?

Короткий ответ: Нет

Длинный ответ: Массив в коде является большой кусок непрерывной памяти, где все CGRect s живут, и имеет автоматическое хранение, а значит, будет автоматически распределяться и освобождаться (когда он выходит за рамки). Другими словами, когда его родительский объект уничтожен, массив будет удален вместе с этими объектами 4551.

Вы можете подтвердить свой размер, напечатав результат sizeof(pastVelocities). Разделение результата на sizeof(CGRect) расскажет вам, сколько объектов этого типа может быть сохранено в нем.

Освобождение должно быть связано с явным распределением. Вам нужно только освободить память, которая распределяется динамически (явно), например, используя семейство функций alloc (malloc, calloc, realloc и т. Д.).

Как их сбросить?

memset(pastVelocities, 0, sizeof(pastVelocities)); 

Это приведет к сбросу весь массив.

+0

Хорошо, подумал! Не уверен. – quantumpotato

1

jweyrich бить меня, но я буду идти вперед и после этого в случае, если это помогает;)

-

Вы не протекает. Время выполнения выделяет достаточно памяти для хранения всех иваров. В этом случае каждый экземпляр QuantumClone будет использовать память ~ 18k (~ 36k на 64-разрядной версии) больше, чем QuantumPilot, так как вы сказали во время выполнения, что ему нужно выделить достаточно хранилища ivar для 4551 CGPoints.

Если pastVelocities были CGFloat *, а не CGFloat[4551], вам нужно будет вручную выделить память с помощью malloc, а затем вызвать free в -dealloc. Однако, объявив его как C-массив фиксированного размера, среда выполнения обрабатывает его (но за счет того, что каждый QuantumClone представляет собой довольно большой объект).

При этом весь этот подход кажется хрупким. Почему 4551? Почему C массивы? Нет ничего плохого в использовании C-массивов для производительности, но я сильно подозреваю, что это преждевременная оптимизация.

+0

Хороший момент для «всего этого подхода кажется хрупким. Почему 4551? Почему C массивы? '. +1 :-) – jweyrich

+0

4551 - это конкретное число, основанное на максимальном количестве кадров, в которые может работать игра. Я не могу поместить переменную вместо 4551, поэтому я просто использую магическое число. – quantumpotato

+1

«CGFloat *» ivar позволит вам «malloc» переменный размер и «realloc», когда вам это нужно, чтобы расти. Если вам нужно сделать это менее хрупким в будущем, вы можете пойти в этом направлении. Или просто используйте «NSArray» из CGPoints, обернутых NSValue. Нет ничего плохого в массивах pure-C значений, но обычно любое преимущество в производительности от их использования отрицается, если вам нужно вызвать метод Obj-C для каждой вставки. – iccir