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的源代码有点难以阅读。
那么崩溃原因是什么?
答案 0 :(得分:0)
rx.disposeBag
将永远不等于label.rx.disposeBag
。如果您的代码在此处崩溃,并且您怀疑使用了那么,请尝试将其删除。在then所使用的闭包之外使用时,编译器将为您提供不同的诊断消息。
如果我不得不猜测,我会在您不期望的时候调查点击手势识别器的触发。我会尝试这样的事情:
$0.rx.tapGesture().when(.recognized).takeUntil(self.viewWillDisappear)