KVO意外崩溃

时间:2012-05-17 13:48:27

标签: iphone objective-c ios

我有一个UITableView,其高度在运行时发生变化:该应用程序加载图像,然后在TableView中显示它们。我已经为我的tableview的页脚实现了一个刷新功能。

由于行的高度不是常数,我在UITableView上添加了一个观察者:

[self.tableView addObserver:_refreshFooter
                 forKeyPath:@"contentSize"
                    options:NSKeyValueObservingOptionNew
                    context:NULL];

在我的 _refreshFooter 中,只要contentSize发生更改,就会调用以下方法:

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

  float realBottom = MAX(tbV.frame.size.height, tbV.contentSize.height);
  self.frame = CGRectMake(self.frame.origin.x,
                          realBottom,
                          self.frame.size.width,
                          self.frame.size.height);
}

该应用程序基本上是一个tabbar应用程序,其中每个选项卡都是TableViewController的一个实例。 在5.0.1和5.1版本的iPhone 4和4S上,我们从未遇到任何因KVO而导致的崩溃,但是我们的用户告诉我们意外的行为,例如页脚没有被移动或崩溃。

遇到的崩溃如下:

0   libobjc.A.dylib 0x3671bf78 objc_msgSend + 15
1   Foundation 0x31145659 NSKeyValuePushPendingNotificationPerThread + 68
2   Foundation 0x3113774b NSKeyValueWillChange + 414
3   Foundation 0x3110e84f -[NSObject(NSKeyValueObserverNotification) willChangeValueForKey:] + 182
4   Foundation 0x31190b23 _NSSetSizeValueAndNotify + 82
5   UIKit 0x32368f8d -[UITableView(_UITableViewPrivate) _updateContentSize] + 572
6   UIKit 0x3249cd51 -[UITableView setTableFooterView:] + 432

1 个答案:

答案 0 :(得分:2)

NSKeyValueObservingOptionNew中发布viewWillDisapper,并添加viewWillAppear