gpt4 book ai didi

ios - EXC_BAD_INSTRUCTION 在 swift 中设置 UILabel.text 时

转载 作者:可可西里 更新时间:2023-11-01 01:06:50 27 4
gpt4 key购买 nike

我是一个敏捷的新手。我正在学习 iOS Programming The Big Nerd Ranch Guide 第四版。书中代码在objc中。我正在将它们翻译成 swift。以下第 150 页的代码对我不起作用。它抛出 EXC_BAD_INSTRUCTION。有人可以指出我错了吗?感谢您的帮助。

func drawHypnoticMessage(message: NSString) {
for i in 0..20 {
let messageLabel = UILabel()
messageLabel.backgroundColor = UIColor.clearColor()
messageLabel.textColor = UIColor.whiteColor()
messageLabel.text = message // Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode0x0)

messageLabel.sizeToFit()

let width = self.view.bounds.size.width - messageLabel.bounds.size.width

let x = Int(arc4random()) % Int(width)

let height = (self.view.bounds.size.height - messageLabel.bounds.size.height)
let y = Int(arc4random()) % Int(height)

var frame = messageLabel.frame
frame.origin = CGPointMake(CGFloat(x), CGFloat(y))
messageLabel.frame = frame

self.view.addSubview(messageLabel)
}
}

注意:我试过更换

messageLabel.text = message

messageLabel.text = "text"

更新 1:

我找到了解决方案

func drawHypnoticMessage(message: NSString) {
for i in 0..<20 {
let messageLabel = UILabel()
messageLabel.backgroundColor = UIColor.clearColor()
messageLabel.textColor = UIColor.whiteColor()
messageLabel.text = message

messageLabel.sizeToFit()

let width = self.view.bounds.size.width - messageLabel.bounds.size.width

let x = Int(arc4random() % UInt32(width))

let height = (self.view.bounds.size.height - messageLabel.bounds.size.height)
let y = Int(arc4random() % UInt32(height))

var frame = messageLabel.frame
frame.origin = CGPointMake(CGFloat(x), CGFloat(y))
messageLabel.frame = frame

self.view.addSubview(messageLabel)
}
}

基本上,我将 let x = Int(arc4random()) % Int(width) 更改为 let x = Int(arc4random() % UInt32(width)) . 有人知道它为什么有效吗?

更新 2:

使用 arc4random_uniform 的最新修订:

func drawHypnoticMessage(message: NSString) {
for i in 0..<20 {
let messageLabel = UILabel()
messageLabel.backgroundColor = UIColor.clearColor()
messageLabel.textColor = UIColor.whiteColor()
messageLabel.text = message

messageLabel.sizeToFit()

let width = self.view.bounds.size.width - messageLabel.bounds.size.width

let x = CGFloat(arc4random_uniform(UInt32(width)))

let height = (self.view.bounds.size.height - messageLabel.bounds.size.height)
let y = CGFloat(arc4random_uniform(UInt32(height)))

var frame = messageLabel.frame
frame.origin = CGPointMake(x, y)
messageLabel.frame = frame

self.view.addSubview(messageLabel)
}
}

最佳答案

根据您提供的修复判断,我认为问题在于 arc4random 返回一个介于 0 和 232 - 1 之间的 32 位无符号整数。您当时正在转换它到一个 Int ,它(我相信)在 iOS(32 位模式)中是一个 32 位有符号整数,所以你的随机数的一半(那些介于 231 和 232 - 1) 不能表示为 Int

在新代码中,您将随机数限制为 0 到 width 或 0 到 height,然后再尝试将其转换为 Int 这就是它不会崩溃的原因。

注意。而不是使用 % 你应该使用 arc4random_uniform() .取随机数的模会引入偏差,arc4random_uniform() 可以避免这种情况。

关于ios - EXC_BAD_INSTRUCTION 在 swift 中设置 UILabel.text 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24597158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com