【问题标题】:swift 4 KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED迅速 4 KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED
【发布时间】:2018-03-15 09:36:02
【问题描述】:

我在 swift 4 中遇到问题。在我的控制器中,我有一个列表和一个分段元素,当它发生变化时会重新加载列表,当我在列表中快速移动然后选择另一个段时,APP 崩溃并返回这个回溯:

* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x20)
    frame #0: 0x0000000180dce7e8 libobjc.A.dylib`object_isClass + 16
    frame #1: 0x00000001825383e8 Foundation`KVO_IS_RETAINING_ALL_OBSERVERS_OF_THIS_OBJECT_IF_IT_CRASHES_AN_OBSERVER_WAS_OVERRELEASED_OR_SMASHED + 68
    frame #2: 0x00000001825368ec Foundation`NSKeyValueWillChangeWithPerThreadPendingNotifications + 300
    frame #3: 0x0000000185ba1614 QuartzCore`CAAnimation_setter(CAAnimation*, unsigned int, _CAValueType, void const*) + 156
    frame #4: 0x0000000185ba11ec QuartzCore`-[CAAnimation setBeginTime:] + 32
    frame #5: 0x0000000185b7e804 QuartzCore`CA::Layer::commit_animations(CA::Transaction*, double (*)(CA::Layer*, double, void*), void (*)(CA::Layer*, CA::Render::Animation*, void*), void (*)(CA::Layer*, __CFString const*, void*), void*) + 560
    frame #6: 0x0000000185b7e2a8 QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 416
    frame #7: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #8: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #9: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #10: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #11: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #12: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #13: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #14: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #15: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #16: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #17: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #18: 0x0000000185b7e20c QuartzCore`CA::Layer::commit_if_needed(CA::Transaction*, void (*)(CA::Layer*, unsigned int, unsigned int, void*), void*) + 260
    frame #19: 0x0000000185ae31ac QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 2148
    frame #20: 0x0000000185b08eb4 QuartzCore`CA::Transaction::commit() + 540
    frame #21: 0x0000000185a5da04 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 928
    frame #22: 0x0000000181dec1cc IOKit`IODispatchCalloutFromCFMessage + 392
    frame #23: 0x0000000181b10010 CoreFoundation`__CFMachPortPerform + 188
    frame #24: 0x0000000181b2a96c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56
    frame #25: 0x0000000181b2a070 CoreFoundation`__CFRunLoopDoSource1 + 440
    frame #26: 0x0000000181b27b44 CoreFoundation`__CFRunLoopRun + 2196
    frame #27: 0x0000000181a47fb8 CoreFoundation`CFRunLoopRunSpecific + 436
    frame #28: 0x00000001838dff84 GraphicsServices`GSEventRunModal + 100
    frame #29: 0x000000018b01c2e8 UIKit`UIApplicationMain + 208
  * frame #30: 0x00000001021b5d74 Pedidos`main at AppDelegate.swift:15
    frame #31: 0x000000018156a56c libdyld.dylib`start + 4

我在this post 看到它可以与观察者相关,但我不知道如何以这种方式定义观察者声明。在我的控制器中,我定义了两个观察者来检测键盘

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
}

在视图上WillDisappear

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

【问题讨论】:

  • 这与 KVO 观察无关,因为您没有使用它。您正在使用通知中心观察。
  • 你确定你没有观察到列表单元格内的东西吗?
  • @technerd 他没有大喊大叫,是堆栈中的一行告诉他有问题。
  • @JeremyP:那没关系。
  • 没错,我没有大喊大叫。这里的问题是我使用 SAP SKD for iOS,并且单元格类型是 FUIObjectTableViewCell,而不是 UITableViewCell,它具有定义的结构。我不确定他们是否在这个单元格定义中使用观察者

标签: ios swift


【解决方案1】:

Notification Center Observation 与 Key Value Observation 无关,因此堆栈跟踪中的问题源自其他东西。

如果您为 tableViewCells 使用一些自定义类,请确保它们被正确地重用。

在您使用FUIObjectTableViewCell 的情况下,根据FUI 文档invoked on changes to the value property,几乎每个属性都有自己的回调onChangeHandler - 基本上是在KVO 上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 2014-07-28
    • 2015-03-12
    • 1970-01-01
    • 2021-02-26
    • 2019-01-12
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多