2017-09-16 111 views
1

系统类是使用引用自身的委托进行子类化的。是否必须在释放其实例并将其引用到自身时将委托设置为零?

class MyScrollView: UIScrollView { 
    convenience init() { 
    delegate = self 
    } 

    // Is this necessary? 
    deinit { 
     delegate = nil 
    } 
} 

是否UIScrollView.delegate财产已被重新分配的情况下,当设置为nil?

+1

您的标题和最后一句提问两个不同的问题。你问这两个,或两者中的哪一个? – Alexander

+0

@Alexander标题已更改。 – Manuel

+0

'UIScrollView'的'delegate'属性声明为'weak'。你在哪里看到'unsafe_unretained'? – rmaddy

回答

0

只有强引用才能保持活动状态。一个弱的参考,如这个delegate成员不足以导致强烈的参考周期。这需要......强有力的参考。

另一方面,delegate = nildeinit没有多大意义。即使delegate成员保持这个实例活着(不是),那么这个deinit不会被首先调用。在

+0

嗨,说实话我有一个类似的问题,我现在很困惑,因为在从苹果(MapKit)的文档(https://developer.apple.com/documentation/mapkit/mkmapviewdelegate如果发现强大的意见从苹果公司将代表设置为无 –

+0

@Hardy_Germany首先,苹果公司正在谈论一般情况,而不是'self'是'委托人'的情况,另外,*设置'nil'的微妙好处是一个委托字段在当前的实现中,没有强引用但是存在弱引用的对象保持活动状态,直到通过弱引用对它们进行下一次访问,手动设置它们为“nil”可能会加速这个释放过程 – Alexander

+0

好,好要知道,非常感谢! –

1
// Is this necessary? 
deinit { 
    delegate = nil 
} 

设定值nil斯威夫特的deinit是永远,永远必要的(任何你觉得它在做什么会被自动ARC反正完成)。还有很多其他原因,在这种情况下这不是必要的,但事实证明,这个deinit从来都不是正确的,Swift胜过了它们。

这与您的问题的标题无关;我不知道为什么这是标题。

+0

然后我将UIScrollView的代理设置为nil,当释放包含'UIScrollView'的实例时,例如'UIViewController'? – Manuel

+0

我不明白你为什么要这么做。你是指代表本身消失的意思吗? (这可以是保存滚动视图的对象,但它不一定是。)如果scrollview的所有者是委托,那么在代理的deinit中调用'scrollView.delegate = nil'是正确的'(但在滚动视图的'deinit'中没有任何意义) –

+0

UIScrollView的委托是'unsafe_unretained',它应该在释放委托对象时尽管用ARC手动设置为nil。 – Manuel

相关问题