1

Apple 的Core Data Utility Tutorial建议实施setNilValueForKey:和测试其效果:

使用键值编码将进程 ID 设置为 nil。构建并运行该实用程序。再次,会发生什么?最后,注释掉 setNilValueForKey: 方法并再次测试。

我尝试使用此代码将进程 ID 设置为 nil:[run setValue:nil forKey:@"processID"];但这不会调用setNilValueForKey:. 为什么不?

这是我的实现;我添加的 NSLog 语句从未出现。

- (void) setNilValueForKey:(NSString*)key {
    NSLog(@"setNilValueForKey: %@",  key) ;
    if ( [key isEqualToString:@"processID"] ) {
        [self setValue:@0  forKey:key ] ;
    }
    else {
        [super setNilValueForKey:key] ;
    }
}

我发现了类似的 stackoverflow 讨论,但没有人回答这个问题。

4

1 回答 1

3

setNilValueForKey:如果使用动态生成的访问器方法,似乎永远不会调用它。

如果您为“Run.m”中的“processID”属性提供自定义设置方法:

- (void)setProcessID:(NSInteger)processID
{
    [self willChangeValueForKey:@"processID"];
    [self setPrimitiveValue:@(processID) forKey:@"processID"];
    [self didChangeValueForKey:@"processID"];
}

然后

[run setValue:nil forKey:@"processID"]

导致setNilValueForKey:被调用。

这只是我通过尝试和错误所经历的,我没有官方参考。但是“核心数据实用程序教程”自 Mac OS X 10.4 以来就存在,其中动态生成的访问器方法(据我所知)尚不存在。所以可能是关于setNilValueForKey:10.5 未更新的部分。但这纯粹是我的猜测。

于 2012-12-15T13:26:49.283 回答