13

Xcode4 が公開されたので、この質問を Apple の秘密の開発者フォーラムから移動します。

次の手順で生成されたコードが Xcode3 と異なる理由を誰か説明できますか? コードの方が優れていますか、それともバグでしょうか?

Core Data カスタム マネージ クラスを使用しています。これは、Xcode3 で従った手順です。

  1. モデル エディターに移動
  2. ソース コードを生成するエンティティを選択します
  3. [ファイル] -> [新規] -> [新しいファイル] に移動します
  4. managedobject クラスを選択します (またはそれが何であれ、検証のために xcode3 を開くことはできません)。
  5. 生成するエンティティを選択します (ステップ 2 で以前に選択したエンティティはオフになっています)。
  6. [完了] をクリックします

さて、Xcode4では、これがその方法だと思いますが、別のコードを生成するため、わかりません:

  1. モデル エディターに移動
  2. エンティティを選択
  3. [ファイル] -> [新規] -> [新しいファイル] に移動します
  4. 「NSManagedObject サブクラス」を選択します
  5. 場所を選択して作成します。

生成されるコードは、いくつかの理由で異なります。

  1. エンティティ内のセットのメンバーを追加および削除するために生成されたコードは、@interface では宣言されなくなりましたが、代わりに @implementation です。これにより、コード センスがこれらのメソッドを検出できなくなります。
  2. オブジェクトを追加および削除するために生成された同じコードが完全に定義され、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 サブクラスを生成するこの新しい方法を好みません。

4

6 に答える 6

11

簡単な答え: Xcode のコード生成を使用しないでください。mogenerator を使用して、楽な生活をお楽しみください。

理由については、言うのは難しいです。私は、Xcode が Core Data サブクラスを生成する方法のファンではなかったので、推奨しません。彼らが行ったことを行った理由について推測することはできますが、Xcode4 と Core Data に関する他の問題に基づいて、「準備ができていない」または「完全にテストされていない」と結論付けることができます。

Xcodeコードジェネレーターを引き続き使用したい場合は、レーダーを提出してください。

于 2011-03-10T01:21:43.477 に答える
1

Xcode4が行ったのは、@dynanmicディレクティブが暗黙的にすることを明示的にすることだけのようです。生成されたコードは、(クリップボードへの)特定の属性のアクセサーを生成するように要求したときにXcode3によって生成されたものとまったく同じように見えます。

なぜ彼らがそうすることにしたのかわかりません。おそらく彼らは、完全な基本的なアクセサーを提供するだけで、カスタムアクセサーを作成しやすくなると考えていました。

誰かがMOGeneratorをXcode4に靴べらにするのはそれほど難しいことではありません。ヒントヒント。誰?みんなおいでよ!誰?ビュラー?

ため息、それは私のように見えます。

于 2011-03-18T16:04:45.317 に答える
1

Monogenerator は Xcode 4 でプラグインしないため、mogenerators コマンドライン util をトリガーする runscript を使用できます。

mogenerator -m Resources/CoreData/XcodeProj.xcdatamodeld/XcodeProj1.xcdatamodel --base-class RootManagedObjectClass --template-path Resources/MoGenerator -O Sources/Classes
于 2011-03-20T09:42:34.150 に答える
0

XCode 4(iOS4.3で最新)で説明した古いXCode 3の方法を使用していますが、以前と同じように機能し、生成されるものは次のとおりです。

    
#import <CoreData/CoreData.h>
@class JiraIssueType;
@class JiraPriority;
@class Customer;
@class JiraComment;
@class JiraComponent;
@class JiraUser;
@class Report;
@class Tag;

@interface JiraIssue :  NSManagedObject  
{
}

@property (nonatomic, retain) NSString * jiraId;
@property (nonatomic, retain) NSString * summary;
@property (nonatomic, retain) NSString * detailedDescription;
@property (nonatomic, retain) NSDate * createdDate;
@property (nonatomic, retain) NSDate * lastUpdatedDate;
@property (nonatomic, retain) NSString * key;
@property (nonatomic, retain) Report * report;
@property (nonatomic, retain) NSSet* comments;
@property (nonatomic, retain) JiraPriority * priority;
@property (nonatomic, retain) NSSet* components;
@property (nonatomic, retain) JiraIssueType * type;
@property (nonatomic, retain) Customer * customer;
@property (nonatomic, retain) NSSet* tags;
@property (nonatomic, retain) JiraUser * assignedTo;

@end


@interface JiraIssue (CoreDataGeneratedAccessors)
- (void)addCommentsObject:(JiraComment *)value;
- (void)removeCommentsObject:(JiraComment *)value;
- (void)addComments:(NSSet *)value;
- (void)removeComments:(NSSet *)value;

- (void)addComponentsObject:(JiraComponent *)value;
- (void)removeComponentsObject:(JiraComponent *)value;
- (void)addComponents:(NSSet *)value;
- (void)removeComponents:(NSSet *)value;

- (void)addTagsObject:(Tag *)value;
- (void)removeTagsObject:(Tag *)value;
- (void)addTags:(NSSet *)value;
- (void)removeTags:(NSSet *)value;

@end
于 2011-03-21T23:04:10.087 に答える
0

1 か月ほど前に同じ問題を発見し、Apple の Xcode 4 プレビュー フォーラムに投稿しました。返事はありません。動作させるために、.m ファイルからメソッド シグネチャを取得し、.h ファイルにカテゴリを作成しました。基本的に、生成されたコードをハッキングして、XCode 3 が行っていた方法に戻します。Xcode 4 の新しいリリース バージョンは試していません。

于 2011-03-10T01:25:28.703 に答える
0

これらのアクセサーの生成は非常に便利でしたが、なぜそれが変更されたのかわかりません。

代わりに、このスニペットを使用します。

- (void)add<#entity#>sObject:(<#entity#> *)value;
- (void)remove<#entity#>sObject:(<#entity#> *)value;
- (void)add<#entity#>s:(NSSet *)value;
- (void)remove<#entity#>s:(NSSet *)value;
于 2011-03-22T11:45:36.940 に答える