【问题标题】:Main Thread Crash Using Key Value Observing And ECSlidingView Library使用键值观察和 ECSlidingView 库的主线程崩溃
【发布时间】:2013-03-15 06:25:38
【问题描述】:

我正在使用 NSKeyValueChange 刷新从 web 服务获取后出现在 tableview 中的图像。

- (void)observeValueForKeyPath:(NSString *)keyPath
              ofObject:(id)object
                change:(NSDictionary *)change
               context:(void *)context {

if ([keyPath isEqual:@"thumbnail"]) {
  UIImage* newImage = [change objectForKey:NSKeyValueChangeNewKey];
  if (newImage != (id)[NSNull null]) {
    self.thumbContainer.image = newImage;
    [self.thumbContainer setNeedsLayout];
  }
}

}

[item addObserver:cell forKeyPath:@"thumbnail" options:NSKeyValueObservingOptionNew context:NULL];

一切正常,直到我将整个导航添加到名为 ECSlidingViewController 的第三方库中以具有类似于 Facebook 和 Sparrow Mail 应用程序的左侧导航。

现在我的应用程序崩溃了,下面是当我尝试在 tableview 中加载更多单元格时得到的图像。

正如您在上图中看到的那样,我不足以解决问题的确切位置。我曾尝试在 StackOverflow 上检查与主线程崩溃相关的类似问题,但它们没有帮助我。

有人可以调查一下,问题可能出在哪里。提前致谢。

更新:我可以运行程序,但是当我向下滚动以显示更多单元格时,此问题会导致程序崩溃。

【问题讨论】:

    标签: ios objective-c xcode uitableview key-value-observing


    【解决方案1】:

    它在 msgSend 调用时崩溃了,这意味着它在错误的指针(不是 obj-c 对象)上发送了一个函数调用。

    [item addObserver:cell forKeyPath:@"thumbnail" options:NSKeyValueObservingOptionNew context:NULL];
    

    您进行了隐式订阅。当项目被释放时,观察者仍在注册项目。

    来自苹果文档: addObserver:forKeyPath:options:context: ...接收者和观察者都没有被保留

    所以为了保持它的清洁,你必须在 item 被释放之前实现 removeObserver:forKeyPath:context:。我猜你是 KVO 与你的单元格,这是一个坏主意,因为你无权访问它们的内存管理(你对分配做出响应,tableViewcell 自己管理它需要多少单元格)。

    所以尽可能订阅和取消订阅 KVO。

    我希望你明白;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多