私のサブクラスでは、 ...という属性に裏打ちされたというパブリックプロパティNSManagedObject
を公開するためのカスタムアクセサーメソッドのセットを作成しました。CMTime
videoDuration
NSData
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
更新-5/8/12: このスレッドとKey-Valueコーディングプログラミングガイドは、KVCが任意の構造体データをサポートするようになったことを示唆しているようです。
UPDATE 2 --5 / 8/12:明らかに、プリミティブアクセサーを実装しないだけで、すべてが正しく機能します。なぜこれが事実なのかはまだ私には困惑しています...