0

わかりましたので、アプリ用にこの統計トラッカーを作成しようとしています。必要なものすべてを追跡する statTracker というデータ モデル オブジェクトを作成しました。セレクターを使用して値を設定および取得できますが、KVC (つまり setValue: forKey: ) を使用しようとすると、すべてがうまくいかず、StatTracker クラスが KVC に準拠していないと表示されます。

valueForUndefinedKey:]: エンティティ StatTracker は、キー「timesLauched」のキー値コーディングに準拠していません。2010-05-18 15:55:08.573

それをトリガーしているコードは次のとおりです。

NSArray *statTrackerArray = [[NSArray alloc] init];
statTrackerArray = [[CoreDataSingleton sharedCoreDataSingleton] getStatTracker];

NSNumber *number1 = [[NSNumber alloc] init];

number1 = [NSNumber numberWithInt:(1 + [[(StatTracker *)[statTrackerArray objectAtIndex:0] valueForKey:@"timesLauched"] intValue])];
[(StatTracker *)[statTrackerArray objectAtIndex:0] setValue:number1 forKey:@"timesLaunched" ];

NSError *error;
if (![[[CoreDataSingleton sharedCoreDataSingleton] managedObjectContext] save:&error]) {
    NSLog(@"error writing to db");
}

これで十分なコードかどうかわかりませんが、さらに必要な場合は、必要なものを教えてください。

KVC を使用できれば、このすべての統計追跡機能を、問題の値の文字列引数を使用して単一のメソッド呼び出しに抽象化できるため、これは非常に便利です。少なくともそれがここで達成したいことです。私は実際に KVC の力を理解していますが、今はそれを機能させる方法を理解しようとしています。

ありがとう!

ニック

出力の下に提案されたコードを追加すると、次のようになります。

オブジェクト: (エンティティ: StatTracker; id: 0x3e1e1b0 ; データ: ) 2010-05-19 11:30:38.173 verses[29526:207] *** 例外 'NSUnknownKeyException' がキャッチされていないため、アプリを終了します。理由: '[ valueForUndefinedKey:] : エンティティ StatTracker は、キー「timesLauched」のキー値コーディングに準拠していません。2010-05-19 11:30:38.174 [29526:207] スタック: (

4

1 に答える 1

1

まず、コードにいくつかのエラーがあります。NSArrayalloc init を呼び出しているとは、次のNSNumber行の割り当てによって破棄されています。したがって、これらは として開始する必要nilがあります (または、2 つの行を組み合わせることができます)。

次に、へのポインター参照を取得して、NSManagedObjectそれをのぞき見して、それがあなたが思っているものであることを確認できるようにする必要があります。

NSArray *statTrackerArray = nil;
statTrackerArray = [[CoreDataSingleton sharedCoreDataSingleton] getStatTracker];

NSNumber *number1 = nil;

id object = [statTrackerArray objectAtIndex:0];
NSLog(@"Object: %@", object);
NSInteger timesLaunched = [[object valueForKey:@"timesLauched"] intValue];
timesLaunched += 1;
number1 = [NSNumber numberWithInteger:timesLaunched];

[object setValue:number1 forKey:@"timesLaunched" ];

NSError *error = nil;
if (![[[CoreDataSingleton sharedCoreDataSingleton] managedObjectContext] save:&error]) {
  NSLog(@"error writing to db: %@\n%@", [error localizedDescription], [error userInfo]);
}

これらの変更により、メモリ リークが解消され、何を操作しようとしているのかを正確に確認できるようになります。また、ブレークポイントをオンにしてデバッガーでこれを実行すると、objc_exception_throwどの行が問題を引き起こしているかを正確に確認できるように、数値の増分も展開しました。

あなたのオブジェクトStatTrackerは の適切なサブクラスではないと思われますNSManagedObject

上記と一致するようにコードを変更し、テストを再実行します。次に、問題をよりよく理解できるように、質問を出力で更新してください。

アップデート

プロパティは「timesLaunched」です

「timesLauched」にアクセスしようとしています

単純なタイプミス。私はあなたのタイプミスをあなたのコードの私のバージョンにコピーしました:)

于 2010-05-19T14:58:08.100 に答える