我在xcode 7中具有一个奇怪的新功能,当我生成新的NSManagedObject子类时,xcode将创建两个类:实体和它们的CoreDataProperties类别,其中包含完整的实现。在下面的图片中,我的意思是一个例子。

ios - xcode 7生成具有附加CoreDataProperties类别的核心数据实体-LMLPHP

我找不到与此有关的任何书面信息,谁可以解释为什么它如此工作

最佳答案

我只是注意到了这一点,也没有找到任何有关它的文档,但是我已经尝试了这个新功能,并且它的工作原理是这样的。首次从Core Data模型生成NSManagedObject子类时,Xcode将生成4个文件:

DBUser.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

NS_ASSUME_NONNULL_BEGIN

@interface DBUser : NSManagedObject

// Insert code here to declare functionality of your managed object subclass

@end

NS_ASSUME_NONNULL_END

#import "DBUser+CoreDataProperties.h"

DBUser.m
#import "DBUser.h"

@implementation DBUser

// Insert code here to add functionality to your managed object subclass

@end

DBUser + CoreDataProperties.h
#import "DBUser.h"

NS_ASSUME_NONNULL_BEGIN

@interface DBUser (CoreDataProperties)

@property (nullable, nonatomic, retain) NSNumber *id;
@property (nullable, nonatomic, retain) NSString *name;

@end

NS_ASSUME_NONNULL_END

DBUser + CoreDataProperties.m
#import "DBUser+CoreDataProperties.h"

@implementation DBUser (CoreDataProperties)

@dynamic id;
@dynamic name;

@end

因此,您现在可以看到,所有属性都在一个类别为(CoreDataProperties)的单独文件中。稍后,如果为同一模型生成NSManagedObject子类,则Xcode 7将仅重新生成2个类别(DBUser + CoreDataProperties.h和DBUser + CoreDataProperties.m)的文件,以更新模型中的所有属性,但不会对其他2个文件进行任何更改(DBUser.h和DBUser.m),因此您可以使用这两个文件在其中添加一些自定义方法或属性等。

在以前的版本中,Xcode始终仅生成2个文件(DBUser.h和DBUser.m),并且在其中放置属性,因此您无法轻松地修改这些文件,因为每次重新生成子类时都会删除自定义实现。因此,通常的做法是手动创建类别并将您的方法放入类别中,这与我们在Xcode 7中看到的相反。但是,这样做有很多缺点,因为我们必须使用类别来实现我们的方法,而这并没有允许做某些事情,现在我们可以轻松修改主界面和实现文件,从而使我们可以执行任何操作。欢呼!

10-07 21:24