gpt4 book ai didi

ios - 为什么我初始化了 uiview 而 uiview 也被 swift 取消了?

转载 作者:行者123 更新时间:2023-11-28 10:12:00 26 4
gpt4 key购买 nike

我想管理内存,所以我想在离开 ViewController 时取消初始化 UIview。
我尝试使用关键字“weak”,但我崩溃了,因为我的聊天键盘是零。
我不知道为什么会崩溃。
谢谢。

class ChatKeyboard: UIView {

var buttonMic:UIButton = { ()->UIButton in
let ui:UIButton = GeneratorButton()
return ui
}()

override init(frame: CGRect) {
super.init(frame: frame)
print("===) ChatKeyboard init.")
translatesAutoresizingMaskIntoConstraints = false
loadContent()
loadConstrain()
}

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

deinit {
print("===) ChatKeyboard deinit.")
}

func loadContent() {

backgroundColor = UIColor.white
addSubview(buttonMic)
}

func loadConstrain() {

buttonMic.snp.makeConstraints { (make) -> Void in
make.left.equalTo(micLeftPadding)
make.top.equalTo(micTopPadding)
make.width.equalTo(UIScreen.main.bounds.width*0.0581)
make.height.equalTo(UIScreen.main.bounds.height*0.045)
}
}
}


class ChatroomViewController: UIViewController{

weak var chatKeyboard:ChatKeyboard?

override func viewDidLoad() {
super.viewDidLoad()

chatKeyboard = ChatKeyboard(frame: CGRect(x: 0, y: 0, width: 300, height: 44))
}
}

我在“chatKeyboard = ChatKeyboard(frame: CGRect(x: 0, y: 0, width: 300, height: 44))”设置断点,然后我的日志打印:

===) ChatKeyboard init.
===) ChatKeyboard deinit.

最佳答案

weak 变量一旦没有强引用就会被销毁。

如果您正在创建 View 并将其直接分配给 weak 变量,它将立即被销毁。弱 IBOutlets 起作用是因为它们被添加到 super View (创建强引用)之前它们被分配给变量。您可以通过在分配给您的属性之前使用局部变量来实现此目的:

let keyboard = ChatKeyboard(...)
view.addSubview(keyboard)
chatKeyboard = keyboard

但是,只要这些 View 没有返回到 View Controller 的强引用, View Controller 对它关心的 View 有强引用也没有坏处。当 View Controller 被销毁时,它们将被销毁。

关于ios - 为什么我初始化了 uiview 而 uiview 也被 swift 取消了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46725419/

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