2

我目前正在嘗試編寫一個類來創建人造網格系統,以跟蹤使用NSMutableArray的NSMutableArray的NSMutableArray的遊戲實體。鑑於我在Objective-C編程方面的經驗有限,我不確定某些事情是如何工作的。如何管理NSMutableArrays的NSMutableArray的內存/使用

下面是init方法:

#define MAX_BALL_ROWCOUNT 6 
#define MAX_BALL_COLCOUNT 4 
- (id) initWithMutableArray:(NSMutableArray *)aList { 
self = [super init]; 
if (self != nil) { 
    ballList = [[NSMutableArray alloc] initWithCapacity: MAX_BALL_ROWCOUNT]; 

    for (int i=0; i<MAX_BALL_ROWCOUNT; i++) { 
     NSMutableArray *balls = [[NSMutableArray alloc] initWithCapacity:MAX_BALL_COLCOUNT]; 
     [ballList addObject:balls]; 
     [balls release]; 
    } 

    int x = 0; 

    for (NSMutableArray *array in ballList) { 
     for (int i = 0; i<MAX_BALL_COLCOUNT; i++) { 
      [array addObject:[aList objectAtIndex:x]]; 
      x++; 
      } 
     } 
    } 

return self; 
} 

ballList是類的NSMutableArray中,將存儲NSMutableArrays。

aList是包含GameEntities的NSMutableArray,我希望跟蹤傳入此類的內容。

要存儲的所有實體大小和數量都是固定的,這就是爲什麼不檢查數組大小和實體數量的原因。

因此,我有第一個問題涉及釋放內存。這是的dealloc函數我目前有:

- (void) dealloc { 
    [ballList release]; 
    [super dealloc]; 
} 

是否呼籲ballList釋放使釋放被叫做它包含NSMutableArrays(隨後將呼籲這些NSMutableArrays包含的對象的釋放)或做我必須寫這樣的東西:

for (NSMutableArray *array in ballList) { 
    [array release]; 
} 
[ballList release]; 

我的第二個問題涉及到使用這個數組的數組。這是遍歷ballList的正確方法嗎?

- (void) update { 
    for (NSMutableArray *array in ballList) { 
     for (GameEntity *balls in array) { 
      (CGPoint) location = [balls getLocation]; 
      [balls setLocation: CGPointMake(location.x+1, location.y+1)]; 
     } 
    } 
} 

最後,在上述地方設置球的位置的代碼,它只會影響中ballList內容或不傳遞到ballList原ALIST改變呢?如果原始aList中的內容不改變,我會如何編寫它以便它們執行?

如果人們有更好的方法來跟蹤網格系統中的實體,我也會對這些實體開放。提前致謝。

回答

0
  1. NSArrayNSMutableArraydealloc被調用時,它所有的內容得到了release消息。所以當你釋放ballList時,如果沒有其他所有者(我猜在這種情況下沒有),那麼它的dealloc被調用,你不需要在這裏釋放其他數組。

  2. 你的循環遍歷很好。儘管對於2D陣列而不是NSArrayNSArray,但我個人更喜歡純粹的C 2D陣列,至少在大多數情況下。

  3. 當您以這種方式添加對象時,您正在數組中添加一個引用。因此,通過數組引用進行的任何更改都會反映在對象的所有引用中。如果你不想要,那麼在數組中添加一個copy對象。

+0

非常感謝你 – 2011-06-02 07:29:01

+0

@Jeff李,請用投票如果任何回答對你有所幫助,並接受解決您的問題的答案。詳細信息請查看FAQ http://stackoverflow.com/faq。 – taskinoor 2011-06-02 07:31:43

+0

看來在這一點上,他沒有足夠的代表upvote。但他應該接受。 – Kongress 2011-06-09 13:29:28

1

第一:一個釋放的NSMutableArray實例足以釋放所有它的對象。

[ballList release]; 

二:您的更新GameEntity實例代碼是罰款,也將影響到原來的ALIST(你叫)。

+0

非常感謝你 – 2011-06-02 07:29:25