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 - 弱变量仍然会导致保留周期?的主要内容,如果未能解决你的问题,请参考以下文章