【问题标题】:Executing a selector after receiving NSNotification calls my view controller's deinit接收到 NSNotification 后执行选择器调用我的视图控制器的 deinit
【发布时间】:2015-12-31 05:08:03
【问题描述】:

我的视图控制器的deinit函数在每次收到NSNotification并执行相应的选择器时都会被调用!!! 这是我的视图控制器的代码:

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: "initModels", name: "xyz.notification", object: nil)
}

func initModels(){
    print("Received notification to init models")
}

deinit {
    print("De-init view controller")
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

每个视图控制器收到通知后,都会正常执行“initModels”,然后直接调用“deinit”! 以下是控制台上打印的内容:

Received notification to init models
De-init view controller

我检查了与多线程相关的所有内容。 通知在主线程上发送,并在主线程上执行。

【问题讨论】:

  • 也许你的 vc 被释放是有正当理由的(例如,引用它的局部变量超出范围)恰好在通知发送后发生......?
  • 另外,让您的通知处理程序采用一个 NSNotification 类型的参数是一个好习惯(但我不确定您的签名有什么后果)。

标签: ios swift nsnotificationcenter nsnotification


【解决方案1】:

天哪! For a reason I don't know, when the selector name starts with "init" it causes my view controller's deinit function to be called!

这是我尝试过的函数名称:

  • initModels >> 调用 deinit
  • init_models >> 调用 deinit
  • initmodels >> 工作正常
  • initializeModels >> 工作正常

【讨论】:

  • 更改您的打印语句以输出调用该方法的对象的内存位置。我想知道调用您的 init* 方法是否会导致原始对象被取消初始化?如果这可以像您展示的那样在裸类中复制,则可能是一个错误。
猜你喜欢
  • 2012-05-11
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2016-07-05
  • 2021-02-25
  • 2019-08-08
  • 1970-01-01
相关资源
最近更新 更多