1

NSTimers在 Objective-C 中有两个。其中之一是使物体在 iPhone 屏幕上缓慢移动,而另一个是得分计时器,每 0.5 秒增加一分。将对象向上移动到屏幕上的计时器也有 0.5 秒的间隔。这些计时器在按下按钮时被调用/激活。按下按钮时,对象会在屏幕上缓慢移动 0.5 秒。0.5 秒后,得分加一分,运行正常。

然而,问题在于,在 0.5 秒后,对象立即移回屏幕底部的原始位置。然后它再次开始向上移动 0.5 秒,并立即移回屏幕底部。计分计时器完美运行,每 0.5 秒加 1 分。

代码

-(IBAction)play:(id)sender{

    gametimer1 = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];

    scoretimer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(scorechange) userInfo:nil repeats:YES];
}

-(void)scorechange{

    score = score + 1;
    scorelab.text = [NSString stringWithFormat:@"%i", score];

}

-(void)gameLoop{

    balstarted = YES;
    bal.center = CGPointMake(bal.center.x, bal.center.y - balspeed);

}

再一次,我的对象 bal 并没有按照应有的方式向上移动屏幕,而是仅向上移动了几个像素(在 0.5 秒内),然后将自身重置到之前的位置。

4

2 回答 2

2

修改

您启用了自动布局。当您更改scorelab.text时,UILabel通知自动布局系统其固有内容大小已更改,这会导致自动布局重置每个视图的位置和大小。由于您没有更改 上的约束bal,因此自动布局会重置其位置。

您可以关闭 autolayout,也可以修改bal的约束而不是center直接设置它。

于 2012-12-26T19:40:41.713 回答
1

选择器都在您安排计时器的同一线程中执行。只要您从同一个线程调度两个计时器,就没有任何干扰。如果在调度的方法中使用共享对象,则没有竞争条件。
仅当您从不同线程调度计时器并且它们使用共享对象时,才会存在竞争条件。

于 2012-12-26T18:03:04.010 回答