为啥我初始化 uiview 和 uiview 也被 swift 删除?

Posted

技术标签:

【中文标题】为啥我初始化 uiview 和 uiview 也被 swift 删除?【英文标题】:Why I init the uiview and the uiview also deinit by swift?为什么我初始化 uiview 和 uiview 也被 swift 删除? 【发布时间】:2017-10-13 08:13:11 【问题描述】:

我想管理内存,所以我想在离开 ViewController 时取消 UIview。 我尝试使用关键字“weak”,但由于我的聊天键盘为 nil,所以我崩溃了。 我不知道为什么让它崩溃。 谢谢。

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.

【问题讨论】:

【参考方案1】:

只要没有强引用,weak 变量就会被销毁。

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

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

然而,你的视图控制器对它关心的视图有强引用并没有什么坏处,只要这些视图也没有对视图控制器的强引用。当视图控制器被销毁时,它们将被销毁。

【讨论】:

【参考方案2】:

原因是您已将 chatKeyBoard 声明为

weak var chatKeyboard:ChatKeyboard?

这意味着您的 viewController 不会对您加载的视图进行任何强引用。因此视图的引用计数不会改变。

在你看来DidLoad

override func viewDidLoad() 
    super.viewDidLoad()

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

您实例化了视图,但是因为一旦控件超出 viewDidLoad 的范围,视图就被弱保持,ARC 释放了视图。

如果您希望即使在调用 viewDidLoad 之后也可以访问您的视图,请声明一个强引用

var chatKeyboard:ChatKeyboard?

希望对你有帮助

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于为啥我初始化 uiview 和 uiview 也被 swift 删除?的主要内容,如果未能解决你的问题,请参考以下文章

如果我的 UIView 设置为不透明,为啥它仍然被模拟器着色为“混合”?

为啥我的 UIView 中没有显示任何内容?

为啥我的 UIView 在滚动时会在 UIScrollView 内移动?

为啥我在 UIScrollView 中的 UIView 不滚动?

为啥我的 UIView 不显示 UISearchBar

当我将 UIView 动画放在不同类的 containerView 中时,为啥我的 UIView 动画不起作用?