7

次のようなプロパティを持つモデルがあります。

ここに画像の説明を入力

たとえば、その値を設定すると:

model.isResolved = @YES;

モデル内に保持されている NSNumber は、それがブール値であることを「忘れます」:

NSLog(@"%@", strcmp([self.isResolved objCType], @encode(BOOL)) == 0 ? @"equal" : @"different");

「違う」と出力します。どうしたの?

4

3 に答える 3

3

どうしたの?

ドキュメントから:

数値オブジェクトは、作成時の型を必ずしも保持しないことに注意してください。

これは、Cocoa の最適化におけるもう 1 つの矛盾です。

于 2012-12-25T09:55:18.217 に答える
2

NSNumberとして保存されます-ちなみに@YESはNSNumberを次のように作成しています

[NSNumber numberWithBool:YES]

したがって、boolを元に戻すには、次のようにします。

[isResolved boolValue]

(モデルを作成するときに[スカラープロパティを使用]にチェックマークを付けることで、これを回避できます)

于 2012-12-26T14:16:53.403 に答える
2

Core Data は、管理対象オブジェクト クラスのすべての属性 (および関係) のゲッター メソッドとセッター メソッドを動的に生成します。これらのアクセサー メソッドは、インスタンス変数によってバックアップされる「通常の」 @syntheized アクセサー メソッドとは異なります。

特に、属性を設定してから再度属性値を取得すると、「元の」オブジェクトとは異なるオブジェクトを取得できます。次のテストは、これfoo1がブール属性「show」を持つ Core Data エンティティのインスタンスであることを示しています。

NSNumber *yes = @YES;
NSLog(@"yes = %p, type = %s", yes, [yes objCType]);
foo1.show = yes;
NSNumber *val = foo1.show;
NSLog(@"val = %p, type = %s", val, [val objCType]);

出力:

yes = 0x16e595c, type = c
val = 0x744c150, type = i

したがって、属性をc = charでエンコードされた数値に設定しても、getter メソッドはi = intでエンコードされた数値を返します。

このテストは iOS シミュレーターで行われました。興味深いことに、OS X 64 ビットで実行されている同じテストは、c = charでエンコードされた数値を返します。

したがって、Core Data オブジェクトのブールおよびその他のスカラー属性の実際のエンコードは、おそらく Core Data の実装の詳細として扱われるべきです。

モデルで定義されている Core Data タイプを確認する必要がある場合は、代わりに objects エンティティの説明を使用できますobjCType

NSEntityDescription *entity = [foo1 entity];
NSAttributeDescription *attr = [[entity attributesByName] objectForKey:@"show"];
NSAttributeType type = [attr attributeType];
if (type == NSBooleanAttributeType) {
    NSLog(@"Its a Boolean!");
}
于 2012-12-25T13:06:35.777 に答える