2012-05-27 2 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 management и memory leaks (из документации разработчиков компании Apple). Первый предлагает вам несколько советов и советов, которые облегчают понимание управления памятью.

+2

При размещении кода в тексте разделите его на обратные выходы (\ ') не звездочками. Таким образом, он будет моноширинным и легче читать, а не курсивом. – Greg

+0

Выполнено, спасибо за подсказку. – diegoreymendez

Смежные вопросы