0

CoreData を使用してデータベースにデータを保存しようとしているので、いくつかの属性を持つ「クライアント」という名前のエンティティを作成しました。そのうちの 2 つは「city」と「post_code」で、どちらも文字列型です。また、NSManagedObjects を拡張する Client クラスを作成し、そこにいくつかのメソッドを記述しました。

-(void) setCity: (NSString*) city
{
    [self setValue:city forKey:@"city"];
}

-(NSString*) getCity
{
    return [self valueForKey:@"city"];
}

-(void) setPostCode: (NSString*) postCode
{
    [self setValue:postCode forKey:@"post_code"];
}

-(NSString*) getPostCode
{
    return [self valueForKey:@"post_code"];
}

getPostCode と setPostCode は期待どおりに機能しますが、setCity または getCity を呼び出すと問題が発生します。スクリーンショットでわかるように、アプリケーションが停止し、メソッドがスレッドでループしています。

ここに画像の説明を入力

フルサイズの画像

これが私がそれらのメソッドを呼び出す方法です

 if([databaseResult count] > 0)
     c = [databaseResult objectAtIndex:0];
 else
     c = [NSEntityDescription insertNewObjectForEntityForName:@"Client" inManagedObjectContext:context];

[c setPostCode:[jsonData valueForKey:@"post_code_invoice"]];
[c setClientType:[jsonData valueForKey:@"company_type"]];
[c setCity:[jsonData valueForKey:@"city_invoice"]];

その呼び出しが機能しなくても、そこに渡したデータに関係なく、常に setCity で停止します

[c setCity:@"aaa"];

誰かが同様の問題を抱えていましたか?

4

1 に答える 1

0

setValueForKey メソッドは、同じ名前を持つため、同じ関数にコールバックしています。

KVCのドキュメントから

setValue:forKey のデフォルトの検索パターン:

プロパティに対して setValue:forKey: のデフォルトの実装が呼び出されると、次の検索パターンが使用されます。

レシーバーのクラスで、パターン set: に一致する名前を持つアクセサー メソッドが検索されます。

アクセサーが見つからず、レシーバーのクラス メソッド accessInstanceVariablesDirectly が YES を返す場合、レシーバーは、名前がパターン _、_is、または is の順序で一致するインスタンス変数を検索します。

一致するアクセサーまたはインスタンス変数が見つかった場合、それを使用して値が設定されます。必要に応じて、「非オブジェクト値の表現」で説明されているように、オブジェクトから値が抽出されます。</p>

適切なアクセサーまたはインスタンス変数が見つからない場合、 setValue:forUndefinedKey: がレシーバーに対して呼び出されます。

したがってsetValue:forKey:、キーcityで呼び出すsetCity:と、実装が呼び出され、実装が呼び出されsetValue:forKey:、ぐるぐる回ります。

値を直接設定するのではなく、なぜこのようにしているのですか?

または、プロパティを使用して、セッターやゲッターを記述する必要さえありません。

キー名が異なるため、他の 2 つの方法が機能します。(アンダースコアがあります)

于 2013-08-27T15:04:26.227 に答える