繁体   English   中英

如何发布C样式数组?

[英]How do I release C style arrays?

我有一个QuantumClone类,它有一个CGPoint数组。 单个QuantumPilot对象在每个级别的开头创建一个QuantumClone 在下一个级别, QuantumPilot将其速度记录到QuantumClone 在新级别的开始,游戏循环运行此代码

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

但最终游戏将被重置,克隆NSMutableArray中的每个QuantumClone对象都将被删除。

我是否通过为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;
}

我是否通过为CGPoint pastVelocities[4551]分配值来泄漏记忆?

简答 :不。

答案很长 :代码中的数组是所有CGRect所在的大块连续内存,并且它具有自动存储功能,这意味着它将自动分配和释放(当它超出范围时)。 换句话说,当它的父对象被销毁时,该数组将与这些4551对象一起消失。

您可以通过打印sizeof(pastVelocities)的结果来验证其大小。 将结果除以sizeof(CGRect)将告诉您可以在其中存储多少个此类型的对象。

解除分配必须与明确的分配结合。 您只需要释放动态(显式)分配的内存,例如,使用alloc函数系列(malloc,calloc,realloc等)。

我该如何重置这些?

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

这将重置整个阵列。

jweyrich打败了我,但是我会继续发布这个以防它有帮助;)

-

你没有泄漏。 运行时分配足够的内存来容纳所有ivars。 在这种情况下,每个QuantumClone实例将使用~14k(64位上约36k)比QuantumPilot更多的内存,因为您告诉运行时它需要为4551 CGPoints分配足够的ivar存储。

如果pastVelocities是CGFloat *而不是CGFloat[4551] ,则需要通过malloc手动分配内存,然后在-dealloc调用free 但是,通过将其声明为固定大小的C数组,运行时会处理它(但代价是使每个QuantumClone成为一个相当大的对象)。

也就是说,这整个方法似乎很脆弱。 为什么选择4551? 为何选择C阵列? 使用C数组来提高性能没有任何问题,但我强烈怀疑这是不成熟的优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM