在我的NSManagedObject
子类中,我编写了一组自定义访问器方法来公开名为CMTime
的公共videoDuration
属性,该属性由名为NSData
的{{1}}属性支持videoDurationData
...
- (CMTime)videoDuration
{
[self willAccessValueForKey:@"videoDuration"];
NSValue *videoDurationValue = [self primitiveVideoDuration];
[self didAccessValueForKey:@"videoDuration"];
if (nil == videoDurationValue) {
NSData *videoDurationData = [self videoDurationData];
if (nil != videoDurationData) {
videoDurationValue = [NSValue valueWithCMTimeData:videoDurationData];
[self setPrimitiveVideoDuration:videoDurationValue];
}
}
return [videoDurationValue CMTimeValue];
}
- (void)setVideoDuration:(CMTime)videoDuration
{
[self willChangeValueForKey:@"videoDuration"];
NSValue *videoDurationValue = [NSValue valueWithCMTime:videoDuration];
[self setPrimitiveVideoDuration:videoDurationValue];
[self didChangeValueForKey:@"videoDuration"];
[self setVideoDurationData:[NSData dataWithValue:videoDurationValue]];
}
- (NSValue *)primitiveVideoDuration
{
NSData *videoDurationData = [self videoDurationData];
if (nil != videoDurationData) {
NSValue *videoDurationValue = [NSValue valueWithCMTimeData:videoDurationData];
return videoDurationValue;
}
return nil;
}
- (void)setPrimitiveVideoDuration:(NSValue *)primitiveVideoDuration
{
if (nil != primitiveVideoDuration) {
NSData *videoDurationData = [NSData dataWithValue:primitiveVideoDuration];
[self setVideoDurationData:videoDurationData];
}
else {
[self setVideoDurationData:nil];
}
}
添加撤消/重做支持后,我的应用程序在-[NSManagedObjectContext save:]
上崩溃并出现EXC_BAD_ACCESS内存异常。但是,如果我注释掉原始访问器方法(并且让-primitiveVideoDuration
方法只返回nil
),那么一切都按预期工作。我猜这与CMTime
有关不是符合键值的标量结构?(参见下面的更新)
更新 - 2012年5月8日: This thread和key-value coding programming guide似乎表明KVC现在支持任意结构数据,这会让我相信我正在尝试做的事情确实可能吗?
更新2 - 5/8/12: 显然,只需不实现原始访问器,一切正常。为什么会出现这种情况仍然令我感到困惑......