Swift Closure在引用self时会有一个强大的引用循环,如下例所示:
class Test { var name = "Hello" func doSomething() { {() -> Void in self.name = "otherName" }() } }
在前面的示例中,我创建了一个强大的引用循环,所以我必须修复它:
class Test { var name = "Hello" func doSomething() { {[uNowned self] () -> Void in self.name = "otherName" }() } }
问题:如果我在封闭中引用自我,我是否必须总是使用无主的自我,或者是否有必须使用弱自我的情况?
If I refer self in a closure do I have to use alway uNowned self or are there cases where I have to use weak self?
都不是.在大多数情况下,只需正常引用自身,不做内存管理.如果存在保留周期的危险,您只需要担心内存管理,除非您将闭包存储在某个地方,例如self的属性,否则没有这样的危险.
您可以通过添加deinit实现轻松证明这一点:
class Test { var name = "Hello" func doSomething() { {() -> Void in self.name = "otherName" }() } deinit { println("bye") } }
现在制作一个Test实例并立即释放它:
func testTest () { let t = test() }
您在控制台中看到“再见”,证明该实例已按良好顺序发布.这段代码中从来没有任何“强引用循环”.你的担忧毫无根据.
[顺便说一下,你使用“封闭”这个词错了.每个Swift函数都是一个闭包.如果仅仅因为在闭包中使用单词self而存在保留周期问题,则每个Swift函数都将受此问题的影响 – 显然情况并非如此.弱者和无主的自我发挥作用的地方是匿名函数 – 正如我之前所说的那样,只有匿名函数本身也被自己保留.