1

NSManagedObjectサブクラスの生成に使用したいくつかのCoreDataエンティティを使用しており、それらのクラスを生成したときに、[プリミティブデータ型にスカラープロパティを使用する]オプションを選択しました。予想どおり、生成されたインターフェイスでは、整数属性がint16_tプロパティとして宣言され、浮動小数点属性がプロパティとして宣言されました。float

@interface TeamStats:NSManagedObject
@property (nonatomic) int16_t pointsScored;
@property (nonatomic) float winPercentage;
@end

このインターフェイス用に生成された実装では、次のように宣言されたこれらのプロパティが表示され@dynamicます。

@implementation TeamStats
@dynamic pointsScored;
@dynamic winPercentage;
@end

さて、Core Dataのドキュメントによると、Core Dataはこれらのスカラープロパティを生成できないため、これらのスカラープロパティのアクセサーメソッドを作成する必要があります。

プロパティをスカラー値として宣言できますが、スカラー値の場合、Core Dataはアクセサーメソッドを動的に生成できません。独自の実装を提供する必要があります(「マネージドオブジェクトアクセサーメソッド」(44ページ)を参照)。Core Dataはプリミティブアクセサーメソッド(primitiveLengthおよびsetPrimitiveLength :)を自動的に合成しますが、コンパイラーの警告を抑制するためにそれらを宣言する必要があります。

これはすべて理にかなっており、これらのアクセサメソッドをどのように作成するかを尋ねるSOの投稿が多数あり、多くの良い答えがあります。

私が理解できないのはこれです:私はこのコードを書き、ドキュメントでこの詳細を読む前にそれを使い始めたので、アクセサメソッドを書いたことはありません。クラスの実装に@dynamic宣言があります。必要なアクセサメソッドを記述していないにもかかわらず、コードは正常に機能しているように見えます。このNSManagedObjectサブクラスのインスタンスを作成しました。このクラスのインスタンスsetPointsScored:pointsScoredメッセージを送信し、結果のインスタンスを永続ストアに保存しました。すべてがうまくいくようです。

ここで何が欠けていますか?Core Dataのドキュメントに記載されているにもかかわらず、生成されるデフォルトの実装はありますか?現在のコードが機能せず、注意する必要がある状況はありますか?NSManagedObjectサブクラスをさらにコーディングする前に、ここで何が起こっているのかを理解したいと思います...

4

1 に答える 1

5

プリミティブデータ型のスカラーアクセサーの作成はXcode4で導入された機能ですが、明らかに十分に文書化されていません。WWDC2011セッションビデオで言及されています

  • 「303iOSのコアデータの新機能」(スライド95)
  • 「315MacOSXのコアデータの新機能」(スライド90)

これらのセッションからの情報によると、スカラーアクセサーはNSNumberオブジェクトを構築するオーバーヘッドを回避するため、「コアデータプログラミングガイド」に示されている実装よりも効率的です。

だからあなたの質問に答えるために:スカラープロパティのデフォルトのアクセサは自動的に生成されます。「CoreDataProgrammingGuide」は、この機能に関して時代遅れです。

于 2012-12-30T13:43:12.733 に答える