1

QuantumClonesの配列を持つクラスがありますCGPoint。単一のQuantumPilotオブジェクトは、QuantumClone各レベルの最初に を作成します。次のレベルでは、QuantumPilotは速度を に記録しますQuantumClone。新しいレベルの開始時に、ゲーム ループはこのコードを実行します

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;
}
4

2 に答える 2

2

CGPoint に値を代入してメモリ リークを起こしていpastVelocities[4551]ますか?

短い答え:いいえ。

長い答え:コード内の配列は、すべてCGRectの s が存在する連続したメモリの大きなチャンクであり、自動ストレージを備えています。つまり、(範囲外になると) 自動的に割り当ておよび割り当て解除されます。つまり、その親オブジェクトが破棄されると、配列はそれらの 4551 個のオブジェクトと共になくなります。

の結果を印刷することで、そのサイズを確認できますsizeof(pastVelocities)。結果を で割ると、sizeof(CGRect)このタイプのオブジェクトをいくつ格納できるかがわかります。

割り当て解除は、明示的な割り当てと結合する必要があります。たとえば、alloc関数ファミリ (malloc、calloc、realloc など) を使用して、動的に (明示的に) 割り当てられたメモリを解放する必要があるだけです。

これらをリセットするにはどうすればよいですか?

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

これにより、アレイ全体がリセットされます。

于 2014-10-11T01:22:17.210 に答える