2

我正在使用 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 上检查与主线程崩溃相关的类似问题,但它们并没有帮助我。

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

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

4

1 回答 1

2

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

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

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

来自 Apple 文档:addObserver:forKeyPath:options:context: ... 接收者和观察者都不会被保留

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

因此,尽可能订阅和取消订阅 KVO。

我希望你明白这个想法;)

于 2013-03-15T08:52:48.327 回答