Я пытаюсь создать подкласс для своих классов NSManagedObject, чтобы инкапсулировать мои процедуры get, set, save.Класс использует свой собственный managedObjectContext с общим persistentStoreCoordinator, так как это должно быть поточно-ориентированным.
Все вызовы метода без проблем, но когда я пытаюсь выполнить метод save:, я получаю следующую ошибку:
NSInvalidArgumentException', reason: '**-[MyEntity save:]: unrecognized selector sent to instance**'
Прилагается упрощенная версия, которая выдает ту же ошибку.
Вот код для подкласса:
@interface XXMyEntity : MyEntity {
@private
NSManagedObjectContext * _managedObjectContext;
}
- (XXMyEntity *) init;
- (BOOL) save:(NSError **)error;
- (NSManagedObjectContext *) managedObjectContext;
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator;
@end
@implementation XXMyEntity
- (XXMyEntity *) init
{
self = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" inManagedObjectContext:[self managedObjectContext]];
return self;
}
- (BOOL) save:(NSError **)error
{
return [[self managedObjectContext] save:error];
}
- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator
{
newCoreDataAppDelegate * appDelegate = (newCoreDataAppDelegate *)[[UIApplication sharedApplication] delegate];
return appDelegate.persistentStoreCoordinator;
}
- (void) dealloc
{
[_managedObjectContext release];
[super dealloc];
}
@end
Реализация:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
XXMyEntity * myEntity = [[XXMyEntity alloc]init];
myEntity.id = [NSNumber numberWithInt:1];
myEntity.title = @"My Title";
[myEntity save:nil];
[self.window makeKeyAndVisible];
return YES;
}
Я также попытался изменить сигнатуру метода на что-то еще, например saveEntity, предполагая, что, возможно, ябезуспешно вмешивался в унаследованный метод.
Любая помощь приветствуется.