objective c - 创建一个NSManagedObject和从同一父类继承的常规NSObject类

Eya*_*yal 4 inheritance core-data objective-c nsmanagedobject

在我的iPhone应用程序中,我有两个viewControllers:viewController1有一个tableView,它显示了Item1对象的列表viewController2有一个tableView,它显示了Item2对象的列表

其中Item1类和Item2类继承自抽象类ParentItem.

现在我想让Item2对象成为NSManagedObject,这样我就可以将它保存在设备上,并使viewController2使用NSFetchedResultsController来加载带有Item2对象的tableView.

但我不希望Item1成为NSManagedObject,我想将它用作常规对象.

问题是,如果我创建ParentItem类作为NSManagedObject,那么Item1类也将是一个NSManagedObject,我不能将它用作常规对象(我的意思是我不能用常规的alloc-init创建一个Item1对象,或者可以一世???)

如果我创建ParentItem类作为常规NSObject,那么Item2类也将是常规NSObject.

Pau*_*l.s 9

您最可能需要的是两个类可以实现的接口.我将使用一个人的例子:

@protocol PersonInterface <NSObject>

@property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName;

@end
Run Code Online (Sandbox Code Playgroud)

继承自的类 NSObject

@interface NonManagedPerson : NSObject <PersonInterface>
@end

@implementation NonManagedPerson

@synthesize firstName = _firstName;
@synthesize lastName  = _lastName;

@end
Run Code Online (Sandbox Code Playgroud)

继承自的类 NSManagedObject

@interface ManagedPerson : NSManagedObject <PersonInterface>
@end

@implementation ManagedPerson

@dynamic firstName;
@dynamic lastName;

@end
Run Code Online (Sandbox Code Playgroud)

现在,如果一个对象需要使用这些类的要么不关心它的超类型,它会只关心对象响应-firstName,-lastName,-setFirstName-setLastName.

为了实现这种灵活性,您需要确保您要使用的对象符合接口,因为您不再需要特定类型,例如:

@interface FootballClub : NSObject

@property (nonatomic, retain) id<PersonInterface> clubManager;

// .. other properties

@end
Run Code Online (Sandbox Code Playgroud)

更新

要获得共享实现,您可以考虑组合/委派.

组成

你创建了另一个封装了常用工作的类,然后将它作为一个可用的ivar在你的类中使用.

代表团

与其他常见元素一样,例如UITableView.在某些时候,它会调用它datasource(实现所需方法的任何元素<UITableViewDatasource>)来要求完成某些事情.然后,您可以让两个对象使用相同的类作为数据源,并且将共享实现.