eggswift / pull-to-refresh

#Busy Re-Building....# An easy way to use pull to refresh and infinite scrolling in Swift. Pod 'ESPullToRefresh'
MIT License
1.82k stars 252 forks source link

demo crash #90

Open liwenDeng opened 7 years ago

liwenDeng commented 7 years ago

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

qq565999484 commented 7 years ago

估计是因为做了延迟了

qq565999484 commented 7 years ago

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

ZT0526 commented 7 years ago

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

piv199 commented 6 years ago

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
        }
    }
tangkunyin commented 6 years ago

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