我正在制作一个涉及按钮在屏幕上移动的游戏。当一个按钮到达屏幕边缘而没有被轻敲时,您会失去一点健康。
-(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]
但是由于某种原因它只会导致应用冻结
答案 0 :(得分:1)
NSTimer保留其userInfo,这是您案例中的按钮对象。你应该使用[timer invalidate]来杀死计时器。
答案 1 :(得分:1)
看起来你正在使用重复计时器来移动按钮。如果您没有明确地结束该计时器,计时器将继续运行,并移动按钮。
通常,当您将removeFromSuperview消息发送到类似按钮的消息时,它将解除分配或“删除”该对象。这是因为当按钮被添加到superview时,superview会保留按钮,保留计数为1,当它从superview中删除时,它会释放它,并将其保留为0。
但是,由于按钮存储为计时器的userInfo,计时器还会保留对象,使其保留计数为2,从超级视图中删除后,它的保留计数仍为1.如果您只需将释放消息发送到按钮,它会将保留计数降低到0并且将取消分配按钮,但它不会停止计时器。下次定时器运行时,它会导致问题,因为您正在尝试访问已释放的内存。
您真正想做的是使计时器无效:[timer invalidate]
。这将停止计时器,计时器将向按钮发送释放消息,导致按钮被释放。