iOS Crash, ошибка управления памятью при использовании NSObject + Rx и тогда? - PullRequest
0 голосов
/ 05 мая 2019

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 немного сложен для чтения.

Так в чем причина сбоя?

1 Ответ

0 голосов
/ 08 мая 2019

rx.disposeBag никогда не будет равно label.rx.disposeBag. Если ваш код не работает, и вы подозреваете, что использовать Затем, попробуйте удалить его. Компилятор выдаст вам различные диагностические сообщения при использовании вне замыкания, используемого Then.

Если бы мне пришлось угадывать, я бы исследовал срабатывание распознавателя жестов касания, когда вы этого не ожидаете. Я бы попробовал что-то вроде этого:

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

Из этой библиотеки .

...