簡體   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