2012-05-27 115 views
2

在我的“connect4”风格的游戏中,我有一个代表7x6网格的数组,数组中的每个“单元格”都包含NSNull或UIView子类'CoinView'。以下是从NSMutableArray和主视图中删除对象的正确方法吗?正确地从视图和数组中删除对象?

- (IBAction)debugOrigin:(id)sender { 
    int x = 0; 
    int y = 0; 
    //get the coin object form the grid 
    CoinView *coin = [[grid objectAtIndex:x] objectAtIndex:y]; 

    //cancel if there's no coin there 
    if ([coin isKindOfClass:[NSNull class]]) { return; } 

    //remove the coin from memory 
    [coin removeFromSuperview]; 
    coin = nil; 
    [[grid objectAtIndex:x] setObject:[NSNull null] atIndex:y]; //will this leak? 

} 

谢谢!

+1

如果你使用ARC,这应该没问题。使用[array setObject:atIndex]将从数组中移除任何先前的对象,并在幕后自动释放它。如果CoinView被保存到其他任何地方,它仍然存在 - 但由于这种性质,它不是泄漏,因为某些东西仍然会引用它 – CrimsonDiego

回答

3

你的代码不会泄漏,事实上(几乎)是正确的。

您应该删除此评论,因为你不存储在你的代码处理(和它最终可能会迷惑你,什么代码确实):

//remove the coin from memory 

在以下行你“再去除它的父的局部变量‘硬币’中所引用的观点:

[coin removeFromSuperview]; 

你分配零到本地变量的硬币,这是很好的做法,以确保它没有被在后面的代码中使用:

coin = nil; 

据我所知,对于NSMutableArray没有setObject:AtIndex:。使用replaceObjectAtIndex:withObject:代替:

[[grid objectAtIndex:x] replaceObjectAtIndex:y withObject:[NSNull null]]; //will this leak? 

作为最后一个音符,我建议你阅读了关于memory managementmemory leaks位(从苹果的开发者文档)。第一个提供了一些提示和技巧,使内存管理更容易理解。

+2

将代码置于文本中时,用反引号(\)对其进行分隔,不是星号。这样,它将是等宽的,更容易阅读,而不是斜体。 – Greg

+0

完成,谢谢你的提示。 – diegoreymendez