Objective c 如何发布C风格的数组?

Objective c 如何发布C风格的数组?,objective-c,arrays,nscopying,Objective C,Arrays,Nscopying,我有一个QuantumClone类,它有一个CGPoints数组。单个QuantumPilot对象在每个级别的开头创建一个QuantumClone。在下一级中,QuantumPilot将其速度记录到其QuantumClone中。在新关卡开始时,游戏循环运行以下代码 QuantumClone *c = [[self.pilot clone] copy]; c.bulletDelegate = self; c.weapon = self.pilot.weapon; [self.clones addO

我有一个
QuantumClone
类,它有一个
CGPoint
s数组。单个
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[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;
}
@接口QuantumClone:QuantumPilot{
cg点速度[4551];
}
-(id)copyWithZone:(NSZone*)区{
QuantumClone*c=[[QuantumClone alloc]init]autorelease];
c、 武器=自我武器;
对于(NSInteger i=0;i<4551;i++){
[c记录速度:过去速度[i]点火:过去点火时间[i];
}
[c RecordlatesIndex:timeIndex];
返回c;
}
-(无效)记录速度:(CGPoint)水平发射:(BOOL)发射{
Cgp点=速度[时间指数];
p、 x=等级x;
p、 y=水平y;
速度[时间指数]=p;
布尔开火=开火;
pastFireTimings[时间索引]=已点火;
timeIndex++;
}
@接口QuantumPilot:CCNode{}
....
@属性(非原子,保留)QuantumClone*clone;
-(无效)复制增量{
[self.clone记录速度:ccp(self.vel.x,-self.vel.y)发射:自发射];
}
-(void)创建克隆{
self.clone=[[QuantumClone alloc]init]autorelease];
self.clone.active=是;
self.clone.arm=self.arm;
}
我是否通过将值分配给CGPoint[4551]而泄漏内存

简短回答:否

Long answer:代码中的数组是一大块连续内存,所有
CGRect
都位于其中,并且它具有自动存储,这意味着它将被自动分配和释放(当它超出范围时)。换句话说,当其父对象被销毁时,数组将与4551个对象一起消失

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

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

如何重置这些


这将重置整个阵列。

jweyrich抢先完成了,但如果有帮助,我会继续发布此消息;)

你没有泄密。运行时分配足够的内存来保存所有IVAR。在这种情况下,每个QuantumClone实例将使用比QuantumPilot多约18k(64位上约36k)的内存,因为您已经告诉运行时需要为4551个CG点分配足够的ivar存储

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


也就是说,整个方法似乎很脆弱。为什么是4551?为什么是C数组?使用C阵列提高性能没有什么错,但我强烈怀疑这是过早的优化。

对否决票有何评论?我试图通过分配给这些cgpointsStructcgpoint{CGFloat x;CGFloat y;};类型定义结构CGPoint CGPoint;准确地在CoreGraphics/CGGeometry.hp中!那么什么是结构数组呢?
很好地说明了这整个方法似乎很脆弱。为什么是4551?为什么选择C阵列?
+1:-)4551是基于游戏可以运行的最大帧数的特定数字。我不能用一个变量来代替4551,所以我只能用这个神奇的数字。一个
CGFloat*
ivar将允许你
malloc
一个变量大小,当你需要它增长时,
realloc
。如果你将来需要让它变得不那么脆弱,你可能想朝这个方向走。或者只需使用NSValue包装的CGPoints的
NSArray
。纯C值数组没有错,但是如果每次插入都必须调用Obj-C方法,那么使用它们的任何性能优势通常都会被抵消!我不确定。
memset(pastVelocities, 0, sizeof(pastVelocities));