为什么我初始化 uiview 和 uiview 也由 swift 设计



我想管理内存,所以我想在离开ViewController时停用UIview。
我尝试使用关键字"弱",但我崩溃了,因为我的聊天键盘为零。
我不知道为什么让它崩溃。
谢谢。

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(帧:CGRect(x: 0, y: 0, 宽度: 300, 高度: 44))"处设置断点,然后我的日志打印:

===) ChatKeyboard init.
===) ChatKeyboard deinit.
一旦没有

weak变量的强引用,它就会被销毁。

如果要创建视图并将其直接分配给weak变量,则会立即销毁该视图。弱IBOutlet之所以有效,是因为它们在分配给变量之前被添加到超级视图中(创建强引用)。您可以通过在分配给媒体资源之前使用局部变量来实现此目的:

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

但是,视图控制器对它所关心的视图具有强引用是没有害处的,只要这些视图没有对视图控制器的强引用。当视图控制器被销毁时,它们将被销毁。

原因是您已将聊天键盘声明为

weak var chatKeyboard:ChatKeyboard?

这意味着您的视图控制器不会保留对您加载的视图的任何强引用。因此,视图的引用计数不会变化。

在您看来,确实加载了

override func viewDidLoad() {
    super.viewDidLoad()
    chatKeyboard = ChatKeyboard(frame: CGRect(x: 0, y: 0, width: 300, height: 44))
}

您实例化了视图,但由于一旦控件超出视图范围,视图就会被弱保留DidLoad ARC 释放视图。

如果您希望即使在 viewDidLoad 调用声明强引用后也能访问您的视图

var chatKeyboard:ChatKeyboard?

希望对你有帮助

在类或结构中,不要使用关键字"weak"来描述您将在同一类或结构中初始化的属性。

最新更新