Цель C: удаление кнопок UIB (а не просто removeFromSuperview) - PullRequest
0 голосов
/ 24 января 2011

Я делаю игру, в которой кнопки перемещаются по экрану. Когда одна кнопка достигает края экрана без нажатия, вы теряете планку здоровья.

-(void) moveStickFig:(NSTimer *)timer {
UIButton *stick = (UIButton *)timer.userInfo;
CGPoint oldPosition = stick.center;
stick.center = CGPointMake(oldPosition.x + 1 , oldPosition.y);
if (oldPosition.x == 900) {
    [stick removeFromSuperview];
    healthCount--;
    NSLog(@"%d", healthCount);
     }
}

Когда вы нажимаете кнопку, она исчезает с помощью [btn removeFromSuperview] Проблема в том, что кнопка все еще существует и продолжает перемещаться по экрану. Есть ли способ удалить его полностью? Я пробовал [stick release], но по какой-то причине приложение просто зависает

Ответы [ 2 ]

1 голос
/ 24 января 2011

Похоже, вы используете повторяющийся таймер для перемещения кнопки. Если вы явно не завершите этот таймер, он продолжит работать и будет перемещать кнопку.

Обычно, когда вы отправляете сообщение removeFromSuperview на что-то вроде кнопки, оно освобождает или «удаляет» этот объект. Это происходит потому, что когда кнопка добавляется в суперпредставление, суперпредставление сохраняет кнопку, давая ей счет сохранения 1, а когда она удаляется из суперпредставления, оно освобождает ее, давая ей счет сохранения 0.

Однако, поскольку кнопка хранится как userInfo таймера, таймер также сохраняет объект, давая ему счет сохранения 2, и после удаления его из суперпредставления он все еще имеет счет сохранения 1. Если вы просто отправьте сообщение об отпускании кнопке, оно уменьшит счет сохранения до 0, и освободит кнопку, но не остановит таймер. При следующем запуске таймера это вызовет проблемы, поскольку вы пытаетесь получить доступ к освобожденной памяти.

Что вы действительно хотите сделать, это сделать недействительным таймер: [timer invalidate]. Это остановит таймер, и таймер отправит сообщение об отпускании на кнопку, в результате чего кнопка будет освобождена.

1 голос
/ 24 января 2011

NSTimer сохраняет свое userInfo, которое является объектом кнопки в вашем случае.Вы должны убить таймер, используя [timer invalidate].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...