pull-to-refresh icon indicating copy to clipboard operation
pull-to-refresh copied to clipboard

demo crash

Open liwenDeng opened this issue 8 years ago • 5 comments

在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] 的区别

liwenDeng avatar Aug 11 '17 08:08 liwenDeng

估计是因为做了延迟了

qq565999484 avatar Aug 22 '17 07:08 qq565999484

unowned self 就是你确定这个 self 是一直存在的 weak 就代表它是一个可选的self 一个 self! 一个self? 他这个要改就得好好看看代码。 有时间再搞吧

qq565999484 avatar Aug 23 '17 01:08 qq565999484

这里需要将[unowned self] in屏蔽掉

ZT0526 avatar Aug 29 '17 08:08 ZT0526

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
        }
    }

piv199 avatar Sep 24 '17 16:09 piv199

@liwenDeng This crash have been fixed in https://github.com/eggswift/pull-to-refresh/pull/102

tangkunyin avatar Oct 05 '17 06:10 tangkunyin