Xcode4:为自定义核心数据管理对象生成不同的代码

pok*_*tad 13 iphone cocoa core-data nsmanagedobject xcode4

现在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
Run Code Online (Sandbox Code Playgroud)

现在,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];
}
Run Code Online (Sandbox Code Playgroud)

有人可以权衡为什么这是不同的?Xcode4代码感觉不喜欢这种生成NSManagedObject子类的新方法.

Mar*_*rra 11

简短回答:不要使用Xcode的代码生成.使用发电机,享受更轻松的生活.

至于原因,很难说.我从来不喜欢Xcode生成Core Data子类的方式,也不会推荐它们.我们可以猜测为什么他们做了他们已经完成的事情,但基于Xcode4和Core Data的其他问题,我会把它归结为"未准备好"或"未完全测试".

如果您想继续使用Xcode代码生成器,请提交雷达文件.