Objective c 目标C:删除UIButtons(不仅仅是从SuperView中删除)

Objective c 目标C:删除UIButtons(不仅仅是从SuperView中删除),objective-c,uibutton,Objective C,Uibutton,我正在做一个游戏,包括在屏幕上移动按钮。当一个按钮到达屏幕边缘而没有被点击时,你失去了一条生命 -(void) moveStickFig:(NSTimer *)timer { UIButton *stick = (UIButton *)timer.userInfo; CGPoint oldPosition = stick.center; stick.center = CGPointMake(oldPosition.x + 1 , oldPosition.y); if (oldPosition.x

我正在做一个游戏,包括在屏幕上移动按钮。当一个按钮到达屏幕边缘而没有被点击时,你失去了一条生命

-(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]
,但出于某种原因,它只会导致应用程序冻结

NSTimer保留其用户信息,这是您案例中的按钮对象。您应该使用[timer invalidate]关闭计时器。

看起来您正在使用重复计时器来移动按钮。如果没有显式结束计时器,计时器将继续运行,并移动按钮

通常,当您将removeFromSuperview消息发送到按钮之类的对象时,它会取消分配或“删除”该对象。这是因为当按钮添加到superview时,superview会保留该按钮,使其保留计数为1,当从superview中删除该按钮时,会将其释放,使其保留计数为0

但是,由于按钮存储为计时器的userInfo,因此计时器还保留对象,使其保留计数为2,并且从superview中删除后,其保留计数仍为1。如果您只是将释放消息发送到按钮,它将把保留计数降低到0,并取消分配按钮,但不会停止计时器。下次计时器运行时,它将导致问题,因为您试图访问释放的内存

您真正想做的是使计时器无效:
[timer invalidate]
。这将停止计时器,计时器将向按钮发送释放消息,导致按钮被释放。

有没有办法将其“从屏幕上”删除?