2013-12-18 7 views
7

これは謎です。キーは、オブジェクトの正当な、永続的な、モデル化された属性です。しかし、setPrimitiveValue:forKey:は失敗し、多くの場合の値をの任意の属性に設定します。ドキュメントでは、この動作は、モデリングされていないキーにsetPrimitiveValue:forKey:を呼び出すときに想定されています。したがって、Core Dataはキーがモデル化されていないと考えているようです。コアデータ:setPrimitiveValue:forKey:私は<code>NSManagedObject</code>に<code>setPrimitiveValue:forKey:</code>を呼び出してい</p> <p>:振る舞いは本当に不気味

奇妙な部分:キーは文字列リテラルとしてハードコードされている場合

、プリミティブ値は確かに正常に設定されています。キーが変数の場合にのみ失敗します。私が使用している変数は、keyPath引数からobserveValueForKeyPath:ofObject:change:context:

keyPath変数が文字列リテラルと同じであることが起こります。 isEqual:はtrueを返し、ハッシュ値は等しい。 keyPath変数のタイプは__NSCFStringです。誰でもなぜsetPrimitiveValue:forKey:が何か異なって振る舞うか知っていますか?ディスク上のファイルからロードされた文字列にさかのぼる

誤動作キー:


、より良い情報を更新(この動作は、OS X 10.9.1上です)。以下の例は孤立したケースです。属性文字列 "mainAttr"がディスクに書き込まれて読み込まれた場合、setPrimitiveValue:forKey:は "mainAttr"ではなく、間違った属性の値を設定します。

コア・データ・オブジェクト:

@interface Boo : NSManagedObject 
@property (nonatomic, retain) NSNumber * mainAttr; 
@property (nonatomic, retain) NSNumber * attr1; 
@property (nonatomic, retain) NSNumber * attr2; 
@property (nonatomic, retain) NSNumber * attr3; 
@end 

-

#import "Boo.h" 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
      NSManagedObjectContext *context = managedObjectContext(); 
    NSString *key = @"mainAttr"; 

    // write to disk, read back in 
    NSString *path = [@"~/Desktop/test.txt" stringByExpandingTildeInPath]; 
    [key writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:NULL]; 
    key = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL]; 

    Boo *boo = [NSEntityDescription insertNewObjectForEntityForName:@"Boo" inManagedObjectContext:context]; 
    [boo setPrimitiveValue:@(5) forKey:key]; 

    NSLog(@"Boo: %@", boo); 
    } 
    return 0; 
} 
+0

iOSでも同様の動作が見られ、保存時に「一般的な」検証エラーが発生していません。あなたの質問はなぜこれが起こるのか興味深い見解をもたらします。 –

+2

私は分かりませんが、問題が発生した場所の 'observeValueForKeyPath:ofObject:change:context:'からコードを見ることに興味があります。 –

+0

これをテストプロジェクトに入れることはできますか? –

答えて

1

はあなたが値を設定するには、以下の3文を必要としています。それを試してみてください。

[self willChangeValueForKey:key]; 
[boo setPrimitiveValue:@(5) forKey:key]; 
[self didChangeValueForKey:key]; 
関連する問題