Похоже, вы используете повторяющийся таймер для перемещения кнопки. Если вы явно не завершите этот таймер, он продолжит работать и будет перемещать кнопку.
Обычно, когда вы отправляете сообщение removeFromSuperview на что-то вроде кнопки, оно освобождает или «удаляет» этот объект. Это происходит потому, что когда кнопка добавляется в суперпредставление, суперпредставление сохраняет кнопку, давая ей счет сохранения 1, а когда она удаляется из суперпредставления, оно освобождает ее, давая ей счет сохранения 0.
Однако, поскольку кнопка хранится как userInfo таймера, таймер также сохраняет объект, давая ему счет сохранения 2, и после удаления его из суперпредставления он все еще имеет счет сохранения 1. Если вы просто отправьте сообщение об отпускании кнопке, оно уменьшит счет сохранения до 0, и освободит кнопку, но не остановит таймер. При следующем запуске таймера это вызовет проблемы, поскольку вы пытаетесь получить доступ к освобожденной памяти.
Что вы действительно хотите сделать, это сделать недействительным таймер: [timer invalidate]
. Это остановит таймер, и таймер отправит сообщение об отпускании на кнопку, в результате чего кнопка будет освобождена.