Ios 为什么这个随机函数代码会在iPhone5和5S上崩溃。

Ios 为什么这个随机函数代码会在iPhone5和5S上崩溃。,ios,iphone,swift,Ios,Iphone,Swift,我有一个在背景中显示图像的视图。图像是从一组图像中拾取的,我使用随机函数来拾取它们。这样做时,应用程序崩溃,但只在iPhone 5/5S上出现 这是我的密码: 这是我在randomImageSelection函数上遇到的崩溃: -未能在(UIView):[setValue:forUndefinedKey:]上设置(isHomeScreenImage)用户定义的已检查属性:此类不符合键isHomeScreenImage的键值编码 提前感谢您的帮助。:) arc4random()生成一个无符号3

我有一个在背景中显示图像的视图。图像是从一组图像中拾取的,我使用随机函数来拾取它们。这样做时,应用程序崩溃,但只在iPhone 5/5S上出现

这是我的密码:

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

-未能在(UIView):[setValue:forUndefinedKey:]上设置(isHomeScreenImage)用户定义的已检查属性:此类不符合键isHomeScreenImage的键值编码

提前感谢您的帮助。:)

arc4random()
生成一个无符号32位整数(
UInt32
)。标准的
Int
对应于iPhone 5()上的32位(有符号)整数,
Int32
类型,在这种情况下
Int(arc4random())
将产生一个(n)(整数溢出)运行时异常,平均约占上述行运行时间的50%。为什么?可由
UInt32
类型表示的数字中有一半太大,无法由
Int32
类型表示

print(INT32_MAX)  // 2147483647
print(UINT32_MAX) // 4294967295 <-- max return of arc4random()

密切相关的线程(这可能是重复的),谢谢@Eric D

arc4random()
生成一个无符号32位整数(
UInt32
)。标准的
Int
对应于iPhone 5()上的32位(有符号)整数,
Int32
类型,在这种情况下
Int(arc4random())
将产生一个(n)(整数溢出)运行时异常,平均约占上述行运行时间的50%。为什么?可由
UInt32
类型表示的数字中有一半太大,无法由
Int32
类型表示

print(INT32_MAX)  // 2147483647
print(UINT32_MAX) // 4294967295 <-- max return of arc4random()

密切相关的线程(这可能是重复的),谢谢@Eric D


删除此行,然后重试,是否仍在崩溃?您的错误似乎与此无关。设置视图层的
masksToBounds
及其
clipstobuunds
是毫无意义的,因为它们完全相同。我同意@HugoAlonso。您需要问问自己,这张
iHomeScreenImage
是从哪里来的,因为它与您正在显示的代码无关。请删除这行代码,然后重试,是否仍在崩溃?您的错误似乎与此无关。设置视图层的
masksToBounds
及其
clipstobuunds
是毫无意义的,因为它们完全相同。我同意@HugoAlonso。你需要问问自己这个
iHomeScreenImage
是从哪里来的,因为它与你正在显示的代码无关。@HugoAlonso因为编译器在编译时无法知道
arc4random
将返回一个太大的数字,无法存储在
Int32
(整数溢出)中。因此,代码将进行编译,但在尝试使用过大的整数初始化
Int32
时会产生运行时异常。试着自己在操场上玩
让foo=Int8(arc4random())
,你应该会看到同样的行为。是的,但是,“这个类不符合密钥isHomeScreenImage的键值编码”呢?这似乎只是问题的一部分,但或者这里发生了更多的事情,或者调试器没有抛出正确的错误描述。@HugoAlonso说实话,我完全错过了这一点(没有任何借口),我只是查看了运行时异常的屏幕截图。无论如何,op应该修复整数溢出问题,并查看第二个错误是否仍然存在。可能是运行时异常导致另一个错误。@EricD。你说得对,看起来是同一个问题。我猜在该线程中,具体问题是使用
NSEC\u/u SEC
=100000000
)乘以至多
3
,得到
3000000000>2147483647=INT32 MAX
。上面的问题是相同的整数溢出问题,但这里源于另一个计算:
arc4random()
的最大返回,即
4294967295>2147483647
。我们应该把这个标为复制品吗?(看看这个答案是否也修复了另一个错误,“这个类不是键值…”。)@HugoAlonso,因为编译器在编译时无法知道
arc4random
将返回一个太大而无法存储在
Int32
中的数字(整数溢出)。因此,代码将进行编译,但在尝试使用过大的整数初始化
Int32
时会产生运行时异常。试着自己在操场上玩
让foo=Int8(arc4random())
,你应该会看到同样的行为。是的,但是,“这个类不符合密钥isHomeScreenImage的键值编码”呢?这似乎只是问题的一部分,但或者这里发生了更多的事情,或者调试器没有抛出正确的错误描述。@HugoAlonso说实话,我完全错过了这一点(没有任何借口),我只是查看了运行时异常的屏幕截图。无论如何,op应该修复整数溢出问题,并查看第二个错误是否仍然存在。可能是运行时异常导致另一个错误。@EricD。你说得对,看起来是同一个问题。我猜在该线程中,具体问题是使用
NSEC\u/u SEC
=100000000
)乘以至多
3
,得到
3000000000>2147483647=INT32 MAX
。上面的问题是相同的整数溢出问题,但这里源于另一个计算:
arc4random()
的最大返回,即
4294967295>2147483647
。我们应该把这个标为复制品吗?(在看到这个答案是否也修复了另一个错误,“这个类不是键值…”)。
let randomImageSelection = arc4random_uniform(UInt32(imageArray.count))
    /* random Integer in: 0 ..< imageArray.count */