0

私のサブクラスでは、 ...という属性に裏打ちされたというパブリックプロパティNSManagedObjectを公開するためのカスタムアクセサーメソッドのセットを作成しました。CMTimevideoDurationNSDatavideoDurationData

- (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

更新-5/8/12: このスレッドKey-Valueコーディングプログラミングガイドは、KVCが任意の構造体データをサポートするようになったことを示唆しているようです。

UPDATE 2 --5 / 8/12:明らかに、プリミティブアクセサーを実装しないだけで、すべてが正しく機能します。なぜこれが事実なのかはまだ私には困惑しています...

4

0 に答える 0