pull-to-refresh
pull-to-refresh copied to clipboard
demo crash
在Demo 中二级页面下拉过程中返回到首页会 crash,
其中一处crash 断点在 ESRefreshComponent.swift 中,
open override func willMove(toSuperview newSuperview: UIView?) {
super.willMove(toSuperview: newSuperview)
/// Remove observer from superview immediately
self.removeObserver()
DispatchQueue.main.async { [unowned self, newSuperview] in
/// Add observer to new superview in next runloop
self.addObserver(newSuperview)
}
}
crash 原因是 newSuperview 会存在为 nil 的情况。
个人觉得是否应该将 DispatchQueue.main.async { [unowned self, newSuperview] 替换为 DispatchQueue.main.async { [weak self, newSuperview] 更好一点? 另外几处的 [unowned self] 改为 [weak self] 是否会更安全?
ps: 我不是很懂 [unowned self] 和 [weak self] 的区别
估计是因为做了延迟了
unowned self 就是你确定这个 self 是一直存在的 weak 就代表它是一个可选的self 一个 self! 一个self? 他这个要改就得好好看看代码。 有时间再搞吧
这里需要将[unowned self] in屏蔽掉
Setting guard let superview = newSuperview else { return } helps, but there is another crash later with the same unowned reference in ESRefreshHeaderView.
open override func didMoveToSuperview() {
super.didMoveToSuperview()
DispatchQueue.main.async {
[unowned self] in
self.scrollViewBounces = self.scrollView?.bounces ?? true
self.scrollViewInsets = self.scrollView?.contentInset ?? UIEdgeInsets.zero
}
}
@liwenDeng This crash have been fixed in https://github.com/eggswift/pull-to-refresh/pull/102