为什么在实现我自己的KVC setter / getter方法时会出现未捕获的异常

时间:2012-02-13 20:40:07

标签: objective-c macos cocoa key-value-observing

我的模型类大多是使用合成的setter / getter方法实现的,一切都很好。一切都很好地连接到用户界面。我后来意识到更改一个属性会导致其他属性发生变化(更改type可能会导致minAmaxA中的更改)所以我手动为{{1}编写了setter / getter方法属性。代码如下:

QBElementType

type

QBElement

@interface QBElementType : NSObject
   @property NSRange minRange;
   @property NSRange maxRange;
@end

@implementation QBElementType
   @synthesize minRange;
   @synthesize maxRange;
@end

问题:从那时起,每当我更改Element的类型时,我都会得到未捕获的异常

  

无法更新观察者< NSTableBinder ...>对于关键路径   来自< QBElement ...>的“type.minRange”,很可能是因为其值   在没有适当的KVO通知的情况下更改了“类型”键   被送了。检查QBElement类的KVO-Compliance。

KVO-Compliance是否遗漏了一些明显的东西?为什么我会收到此错误?

3 个答案:

答案 0 :(得分:3)

您无需明确调用-willChangeValueForKey:-didChangeValueForKey:,因为您的setter命名正确。通过KVC / KVO机器的魔力自动添加对它们的调用。问题可能是它们被有效地调用了两次。

此外,由于minAmaxA似乎只是从类型派生而来,您可以将它们设为只读并告诉KVO自动通知观察者minA和maxA已经随时更改{{1更改:

type

答案 1 :(得分:2)

实施手动设置器并不意味着您必须实现手动KVO通知。如果您不通过设置器更新属性的支持ivar,那么您绝对需要这些。 KVO将自动替换您的setter,其版本在" real"之前和之后调用will / didChange方法。 setter被称为。如果您想在自己的setter中自己调用它们(例如,您需要更精确地控制它们被调用的时间),则需要覆盖方法+automaticallyNotifiesObserversForKey:以返回NO type }键。

我认为你现在收到错误的原因是因为KVO机器看到你连续两次调用[self willChangeValueForKey:@"type"](一次通过KVO"魔术&# 34;,一次手动)而不调用[self didChangeValueForKey:@"type"]

答案 2 :(得分:0)

正如其他人所说,您可以放弃willChangeValueForKey:didChangeValueForKey:来电并实施:

+ (NSSet *) keyPathsForValuesAffectingMinA
{
    return [NSSet setWithObject:@"type"];
}

当然,minB也是如此。

然后将minAminB设为只读属性。

不同的方法主要是风格偏好。