是否必须在释放其实例并将其引用到自身时将委托设置为零?
系统类是使用引用自身的委托进行子类化的。是否必须在释放其实例并将其引用到自身时将委托设置为零?
class MyScrollView: UIScrollView {
convenience init() {
delegate = self
}
// Is this necessary?
deinit {
delegate = nil
}
}
是否UIScrollView.delegate
财产已被重新分配的情况下,当设置为nil?
只有强引用才能保持活动状态。一个弱的参考,如这个delegate
成员不足以导致强烈的参考周期。这需要......强有力的参考。
另一方面,delegate = nil
在deinit
没有多大意义。即使delegate
成员保持这个实例活着(不是),那么这个deinit
不会被首先调用。在
嗨,说实话我有一个类似的问题,我现在很困惑,因为在从苹果(MapKit)的文档(https://developer.apple.com/documentation/mapkit/mkmapviewdelegate如果发现强大的意见从苹果公司将代表设置为无 –
@Hardy_Germany首先,苹果公司正在谈论一般情况,而不是'self'是'委托人'的情况,另外,*设置'nil'的微妙好处是一个委托字段在当前的实现中,没有强引用但是存在弱引用的对象保持活动状态,直到通过弱引用对它们进行下一次访问,手动设置它们为“nil”可能会加速这个释放过程 – Alexander
好,好要知道,非常感谢! –
// Is this necessary?
deinit {
delegate = nil
}
设定值nil
斯威夫特的deinit
是永远,永远必要的(任何你觉得它在做什么会被自动ARC反正完成)。还有很多其他原因,在这种情况下这不是必要的,但事实证明,这个deinit
从来都不是正确的,Swift胜过了它们。
这与您的问题的标题无关;我不知道为什么这是标题。
然后我将UIScrollView的代理设置为nil,当释放包含'UIScrollView'的实例时,例如'UIViewController'? – Manuel
我不明白你为什么要这么做。你是指代表本身消失的意思吗? (这可以是保存滚动视图的对象,但它不一定是。)如果scrollview的所有者是委托,那么在代理的deinit中调用'scrollView.delegate = nil'是正确的'(但在滚动视图的'deinit'中没有任何意义) –
UIScrollView的委托是'unsafe_unretained',它应该在释放委托对象时尽管用ARC手动设置为nil。 – Manuel
您的标题和最后一句提问两个不同的问题。你问这两个,或两者中的哪一个? – Alexander
@Alexander标题已更改。 – Manuel
'UIScrollView'的'delegate'属性声明为'weak'。你在哪里看到'unsafe_unretained'? – rmaddy