iOS崩溃,使用NSObject + Rx时出现内存管理错误,然后呢?

时间:2019-05-05 06:54:28

标签: ios swift firebase crash rx-swift

iOS崩溃,我认为是由使用第三方库NSObject + Rx然后使用内存管理错误引起的吗?

Firebase crashlytics报告,

  

已崩溃:com.apple.main-thread   EXC_BREAKPOINT 0x0000000104a5be14

     

0   iOS   LoginRegisterInputView.swift-第328行   LoginRegisterInputView.initRegisterUI()中的关闭#5

     

1   然后   $ S4ThenAAPAARlzCrlE4thenyxyxKXEKF + 32

     

2   iOS   LoginRegisterInputView.swift-第314行   LoginRegisterInputView.initRegisterUI()

     

3   iOS   LoginRegisterInputView.swift-第225行   LoginRegisterInputView.initUI(style:)

     

4   iOS   LoginRegisterInputView.swift-第42行   专门的LoginRegisterInputView.init(style:rootVC:)

代码如下:

let registerProtocolLabel = UILabel().then {
            let string = "RegisterIterm".localized().replacingOccurrences(of: "<a>", with: "+").replacingOccurrences(of: "</a>", with: "+")
            let array:[String] = string.components(separatedBy: "+")
            $0.font = mThemeMinFont
            if array.count > 0 {
                $0.attributedText = (array[0].color(mRGBA(120, 120, 120, 1)) + array[1].color(mThemePinkColor).underline + array[2].color(mRGBA(120, 120, 120, 1))).attributedText
            }
            $0.textAlignment = .left
            $0.numberOfLines = 0
            $0.lineBreakMode = .byWordWrapping
            $0.rx.tapGesture().when(.recognized)
                .subscribe(onNext:{ _ in
                 AppUtils.jumpToWebView(route: AppUtils.getFunctionUrl(.term))
                }).disposed(by: rx.disposeBag)
        }

该代码具有错误性和讨厌性。它不是我写的,不是我同事写的。

现在,我负责这些错误。

then中读取内容非常容易。

对象仅在闭包中设置其属性。它不会访问其他属性。因此它是非常ARC的,不会干扰其他对象的内存管理。

虽然我同事的代码不是那么的,但是却做了两次。

我认为崩溃是由NSObject + Rx引起的。

NSObject+Rx的代码很简单,只需编写糖即可。

/// a unique DisposeBag that is related to the Reactive.Base instance only for Reference type
    public var disposeBag: DisposeBag {
        get {
            return synchronizedBag {
                if let disposeObject = objc_getAssociatedObject(base, &disposeBagContext) as? DisposeBag {
                    return disposeObject
                }
                let disposeObject = DisposeBag()
                objc_setAssociatedObject(base, &disposeBagContext, disposeObject, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                return disposeObject
            }
        }

在上面的场景中,从NSObject + Rx的源代码中读取,我认为  rx.disposeBag等于label.rx.disposeBag

这可能会导致错误。

RxSwift的源代码有点难以阅读。

那么崩溃原因是什么?

1 个答案:

答案 0 :(得分:0)

rx.disposeBag将永远不等于label.rx.disposeBag。如果您的代码在此处崩溃,并且您怀疑使用了那么,请尝试将其删除。在then所使用的闭包之外使用时,编译器将为您提供不同的诊断消息。

如果我不得不猜测,我会在您不期望的时候调查点击手势识别器的触发。我会尝试这样的事情:

$0.rx.tapGesture().when(.recognized).takeUntil(self.viewWillDisappear)

From this library