使用计时器后,应用程序在arc4random()之后崩溃?

时间:2014-06-14 02:03:22

标签: ios swift nstimer arc4random

Swift 中,我有一个计时器。每隔一秒,屏幕上的点变为不同的点图像。它选择随机显示的点。这就是我想要的。应用程序在启动时崩溃。就像,马上。这次崩溃是如何解决的?此外,在那之后,它将与我当前的代码一起使用吗?在评论了一些内容并进行测试后,导致它的行是imageNumber = Int(arc4random())%13 。这是如何解决的?

我的代码如下:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    var dotChangingTimer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("changeDot"), userInfo: nil, repeats: true)

    var theRandomImages: UIImage[] = [dotOne, dotTwo, dotThree, dotFour, dotFive, dotSix, dotSeven, dotEight, dotNine, dotTen, dotEleven, dotTwelve, dotThirteen]

    openingScreenDynamicDot = theRandomImages[Int(imageNumber)]
    let finalChangingDotWelcomePage = UIImageView(image: openingScreenDynamicDot)
    finalChangingDotWelcomePage.frame = CGRectMake(110, 234, 100, 100)
}
func changeDot() {
    println("the images should be changing...")
    imageNumber = Int(arc4random())%13

    var theRandomImages: UIImage[] = [dotOne, dotTwo, dotThree, dotFour, dotFive, dotSix, dotSeven, dotEight, dotNine, dotTen, dotEleven, dotTwelve, dotThirteen]

    openingScreenDynamicDot = theRandomImages[(imageNumber)]
}

2 个答案:

答案 0 :(得分:2)

您正在尝试将UInt32值转换为Int,而不考虑检查范围。由于UInt32是无符号的,因此arc4random()的可能返回值的一半将超出Int的范围,并且当您尝试强制转换时,您将收到运行时错误。做你正在做的事情的安全方法是先取模数和,然后转换为Int

imageNumber = Int(arc4random() % 13)

然而,这引入了模偏差,这会影响结果的随机性,所以你最好用:

imageNumber = Int(arc4random_uniform(13))

这两种方法都会为您提供0到12之间的随机值。

答案 1 :(得分:1)

我与arc4random()发生了类似的神秘崩溃,并通过切换到arc4random_uniform()来解决它。

试试这个:

imageNumber = Int(arc4random_uniform(13))