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

时间:2012-01-15 12:37:18

标签: objective-c inheritance core-data 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。

1 个答案:

答案 0 :(得分:9)

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

@protocol PersonInterface <NSObject>

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

@end

继承自NSObject

的班级
@interface NonManagedPerson : NSObject <PersonInterface>
@end

@implementation NonManagedPerson

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

@end

继承自NSManagedObject

的班级
@interface ManagedPerson : NSManagedObject <PersonInterface>
@end

@implementation ManagedPerson

@dynamic firstName;
@dynamic lastName;

@end

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

为了保证这种灵活性,你需要确保你想要使用的对象符合界面,因为你不再为特定的类型烦恼,例如:

@interface FootballClub : NSObject

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

// .. other properties

@end

更新

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

作文

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

代表团

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