为什么这个随机功能代码在iPhone 5和5S上崩溃。

时间:2016-02-17 16:47:30

标签: ios iphone swift

我有视图在后台显示图像。从一组图像中挑选图像,我使用随机函数来挑选它们。在这样做的应用程序崩溃,但只在iPhone 5 / 5S上。

这是我的代码: ...

//Images
let rest28 = UIImage(named: "rest28")
        let rest29 = UIImage(named: "rest29")
        let rest30 = UIImage(named: "rest30")

// image Array
        imageArray = [rest1!, rest3!, rest4!, rest5!, rest6!, rest7!, rest8!, rest9!,
            rest10!, rest11!, rest12!, rest13!, rest15!, rest17!, rest18!, rest21!, rest22!, rest24!, rest25!, rest26!, rest27!, rest28!, rest29!, rest30!]

        // Picking a number in the array of images. 
        let randomImageSelection = 0 + Int(arc4random()) % (0 - imageArray.count - 1)
        backgroundImage.image = imageArray[randomImageSelection]

这是我在randomImageSelection函数上遇到的崩溃:

- 无法在(UIView)上设置(isHomeScreenImage)用户定义的检查属性:[setValue:forUndefinedKey:]:此类不是键值isHomeScreenImage的密码值编码。

enter image description here

提前感谢您的帮助。 :)

1 个答案:

答案 0 :(得分:3)

UInt32产生无符号的32位整数(Int)。标准Int32对应于iPhone 5(iPhone 5 - 1.3 GHz dual core 32-bit ARMv7-A processor),Int(arc4random())类型上的32位(带符号)整数,在这种情况下UInt32将产生一个(n)(整数)溢出)运行时异常〜平均上行运行时间的50%。为什么? Int32类型可表示的数字中有一半太大,无法用print(INT32_MAX) // 2147483647 print(UINT32_MAX) // 4294967295 <-- max return of arc4random() 类型表示。

arc4random()

使用arc4random_uniform()函数,您无需在32位无符号整数范围内生成任何随机数;另一种方法是使用0..<30生成let randomImageSelection = arc4random_uniform(UInt32(imageArray.count)) /* random Integer in: 0 ..< imageArray.count */ 范围内的随机数。尝试使用以下内容替换您标记为错误的行:

Media.MEDIA_RUNNING

密切相关的主题(这可能是重复的),谢谢@Eric D。