[英]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.