iOS - 弱变量仍然会导致保留周期?

Posted

技术标签:

【中文标题】iOS - 弱变量仍然会导致保留周期?【英文标题】:iOS - Weak var can still cause retain cycle? 【发布时间】:2015-09-13 16:06:19 【问题描述】:

这是我的真实代码:

@IBOutlet weak var contentTextView: SmartTextView! 
    didSet 
        self.contentTextView.onDidBeginEditing = 
            $0.layer.borderColor = Util.green.CGColor
        
        self.contentTextView.onDidEndEditing = 
            $0.layer.borderColor = Util.gray.CGColor
        
        self.contentTextView.layer.borderWidth = 1 / Util.screenScale
        self.contentTextView.layer.borderColor = Util.gray.CGColor
        self.contentTextView.minHeight = 148
        self.contentTextView.maxHeight = 148
        self.contentTextView.onChange =  [unowned self] text in
            var content = text.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "\n\t"))
            self.contentLenthLabel.text = "\(self.MAX_CONTENT - count(content))"
        
    

如果我删除 [unowned self] 语句,我可以在 Instruments 中看到保留周期问题。

KVO 或其他东西使弱 var 仍然会导致保留循环吗?

【问题讨论】:

@matt 既然 contentTextView 是一个弱变量,我认为无论 SmartTextView 是如何实现的,它都不应该导致保留周期。我错了吗?而且我确信保留周期是真实的。顺便说一句,SmartTextView 只是 UITextView 的一个子类,我写它来模仿 UILabel 的占位符功能并添加自动增长功能,如果您需要,我可以显示代码。 【参考方案1】:

weak 引用是红鲱鱼;它与这里的故事无关。没有[unowned self],您将保留此视图,而此视图将保留您。这是一个保留周期:

UIViewController 保留其视图

视图保留其子视图;这些子视图之一是 SmartTextView

SmartTextView 保留onChange 功能

函数保留self(UIViewController),除非你说unowned self

【讨论】:

也许强引用循环更合适?现在,问题是当视图控制器被推送和弹出时,它没有得到 deinit。 我不明白你在说什么。你的问题是:为什么需要unowned self?我是这么解释的。所以保留弱引用并保留unowned self。现在你明白为什么了。对吗? 天啊,我终于明白你在说什么了。谢谢!

以上是关于iOS - 弱变量仍然会导致保留周期?的主要内容,如果未能解决你的问题,请参考以下文章

用强弱自我打破保留周期

此 CAAnimation 会导致泄漏或保留周期吗?

为啥在 ARC 中发送消息会导致保留周期警告,但属性集不会?

深入了解保留周期

在此块中强烈捕获自我可能会导致保留周期

目标 C - 因保留周期而丢失