Xcode4 が公開されたので、この質問を Apple の秘密の開発者フォーラムから移動します。
次の手順で生成されたコードが Xcode3 と異なる理由を誰か説明できますか? コードの方が優れていますか、それともバグでしょうか?
Core Data カスタム マネージ クラスを使用しています。これは、Xcode3 で従った手順です。
- モデル エディターに移動
- ソース コードを生成するエンティティを選択します
- [ファイル] -> [新規] -> [新しいファイル] に移動します
- managedobject クラスを選択します (またはそれが何であれ、検証のために xcode3 を開くことはできません)。
- 生成するエンティティを選択します (ステップ 2 で以前に選択したエンティティはオフになっています)。
- [完了] をクリックします
さて、Xcode4では、これがその方法だと思いますが、別のコードを生成するため、わかりません:
- モデル エディターに移動
- エンティティを選択
- [ファイル] -> [新規] -> [新しいファイル] に移動します
- 「NSManagedObject サブクラス」を選択します
- 場所を選択して作成します。
生成されるコードは、いくつかの理由で異なります。
- エンティティ内のセットのメンバーを追加および削除するために生成されたコードは、@interface では宣言されなくなりましたが、代わりに @implementation です。これにより、コード センスがこれらのメソッドを検出できなくなります。
- オブジェクトを追加および削除するために生成された同じコードが完全に定義され、CoreDataGeneratedAccessors を使用して自動生成されなくなりました
たとえば、Xcode3 は HEADER ファイルに次のコードを生成します。
@interface SampleEntity (CoreDataGeneratedAccessors)
- (void)addChildObject:(Child *)value;
- (void)removeChildObject:(Child *)value;
- (void)addChild:(NSSet *)value;
- (void)removeChild:(NSSet *)value;
@end
これで、Xcode4 は IMPLEMENTATION ファイルに次のコードを生成します。
@implementation SampleEntity
@dynamic children;
- (void)addChildObject:(Child *)value {
NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1];
[self willChangeValueForKey:@"children" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[[self primitiveValueForKey:@"children"] addObject:value];
[self didChangeValueForKey:@"children" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects];
[changedObjects release];
}
なぜこれが違うのか、誰かが検討できますか?Xcode4 のコード センスは、NSManagedObject サブクラスを生成するこの新しい方法を好みません。