既然 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 code sense 不喜欢这种生成 NSManagedObject 子类的新方法。