为什么这些自定义访问器在尝试保存托管对象上下文时会导致EXC_BAD_ACCESS?

时间:2012-05-07 15:41:39

标签: objective-c ios core-data

在我的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 threadkey-value coding programming guide似乎表明KVC现在支持任意结构数据,这会让我相信我正在尝试做的事情确实可能吗?

更新2 - 5/8/12: 显然,只需实现原始访问器,一切正常。为什么会出现这种情况仍然令我感到困惑......

0 个答案:

没有答案