gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:44:15 27 4
gpt4 key购买 nike

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

QBElementType

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

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

QBElement

@interface QBElement : QBElementType{
QBElementType *_type;
}
@property (weak) QBElementType *type;
@property NSUInteger minA;
@property NSUInteger maxA;
@end


@implementation QBElement
@synthesize minA = _minA;
@synthesize maxA = _maxA;

- (QBElementType*)type
{
return _type;
}
- (void)setType:(QBElementType*)newType
{
[self willChangeValueForKey:@"type"];
_type = newType; // no need to bother with retain/release due to ARC.
[self didChangeValueForKey:@"type"];

/* Having the following 4 lines commented out or not changes nothing to the error
if (!NSLocationInRange(_minA, newType.minRange))
self.minA = newType.minRange.location;
if (!NSLocationInRange(_maxA, newType.maxRange))
self.maxA = newType.maxRange.location;
*/
}
@end

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

Cannot update for observer <NSTableBinder...> for the key path "type.minRange" from <QBElement...>, most likely because the value for the key "type" was changed without an appropriate KVO notification being sent. Check KVO-Compliance of the QBElement class.

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

最佳答案

您不需要显式调用 -willChangeValueForKey:-didChangeValueForKey: 因为您的 setter 已正确命名。对它们的调用将通过 KVC/KVO 机器的魔力自动添加。问题可能是它们实际上被调用了两次。

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

@interface QBElement : QBElementType{
QBElementType *_type;
}
@property (weak) QBElementType *type;
@property (readonly) NSUInteger minA;
@property (readonly) NSUInteger maxA;
@end

@implementation QBElement

+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

if ([key isEqualToString:@"minA"] ||
[key isEqualToString:@"maxA"]) {
keyPaths = [keyPaths setByAddingObject:@"type"];
}

return keyPaths;
}

@synthesize type;

- (NSUInteger)minA
{
return self.type.minRange.location;
}

- (NSUInteger)maxA
{
return self.type.maxRange.location;
}

@end

关于objective-c - 为什么在实现我自己的 KVC setter/getter 方法时会出现未捕获的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9267678/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com