iOS Crash, я думаю, это вызвано ошибкой управления памятью при использовании сторонней библиотеки NSObject + Rx, а затем?
Отчеты о сбоях Firebase,
已 崩溃: com.apple.main-нить
EXC_BREAKPOINT 0x0000000104a5be14
0
IOS
LoginRegisterInputView.swift - 第 328 行
закрытие # 5 в LoginRegisterInputView.initRegisterUI ()
1
затем
$ S4ThenAAPAARlzCrlE4thenyxyxKXEKF + 32
2
IOS
LoginRegisterInputView.swift - 第 314 行
LoginRegisterInputView.initRegisterUI ()
3
IOS
LoginRegisterInputView.swift - 第 225 行
LoginRegisterInputView.initUI (стиль:)
4
IOS
LoginRegisterInputView.swift - 第 42 行
специализированный LoginRegisterInputView.init (стиль: 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)
}
Код содержит ошибки и неприятные. Это написано не мной, а моим коллегой.
Теперь я отвечаю за ошибки.
Чтение с , затем , это очень просто.
Объект просто устанавливает свои свойства в замыкании. Это не посещает другие свойства. Так что это очень 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 немного сложен для чтения.
Так в чем причина сбоя?