Failed to call designated initializer on NSManagedObject class 'Item'

最后都变了- 提交于 2019-12-13 19:05:38

问题


I am using core-data to add/delete 'Items' (NSManagedObject) to the model.

However, I am receiving the error in the title:

Code: Failed to call designated initializer on NSManagedObject class 'Item' I would really appreciate it if you could tell me where I am going wrong. I presume that the problem is to do with initialising Item.

RootViewController.m

- (void)AddNew {
    CDManager *manager = [[CDManager alloc] initWithManagedObjectContext:[self managedObjectContext] andDelegate:self];
    [manager addNewObject:[Item itemWithDescription:@"testing" dateSet:[NSDate date] fullfillBy:[NSDate date]]];
    [manager release];
}

CDManager.m

- (id) initWithManagedObjectContext:(NSManagedObjectContext *)context andDelegate:(id<CDManagerDelegateProtocol>)delegate {
    if ((self = [super init])) {
        [self setDelegate:delegate];
        [self setContext:context];
        [self setItems:[[NSMutableArray alloc] init]];
        [self updateItems];
    }
    return self;
}

- (void)addNewObject:(Item *)item {
    NSManagedObjectContext *context = _context;
    Item *items = [NSEntityDescription
                            insertNewObjectForEntityForName:@"Item" 
                            inManagedObjectContext:_context];
    [items setDateSet:[item dateSet]];
    [items setDateToFullfill:[item dateToFullfill]];
    [items setItemDescription:[item itemDescription]];
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Couldn't save due to : %@", [error localizedDescription]);
    }
    [_delegate manager:self didAddNewItem:items];
    [self update];
}

Item.m

static Item *shared = nil;
@implementation Item
......

+ (Item *)itemWithDescription:(NSString *)d dateSet:(NSDate *)date fullfillBy:(NSDate *)dates {
    @synchronized(shared) {
        if (!shared || shared == NULL) {
            shared = [[Item alloc] init];
        }
        [shared setItemDescription:d];
        [shared setDateSet:date];
        [shared setDateToFullfill:dates];
        return shared;
    }
}

回答1:


The Item class is defined as a singleton. There is no provision for singleton NSManagedObject subclasses. The context won't understand how to handle it.

This code makes very little sense. Here you initialize a singleton Item object:

[manager addNewObject:[Item itemWithDescription:@"testing" dateSet:[NSDate date] fullfillBy:[NSDate date]]]

... but you don't attach it to a context before passing it to the addNewObject: method. In turn that method creates another instance of Item and then populates it with the values of the presumed singleton. Why? If your singleton code actually works, every time you create an Item instance, you will get the same object back. What is the point of creating yet another reference to the singleton and setting its own values to itself. If the singleton code doesn't work, why use a singleton in the first place?

Uses like this is why singletons have such a bad rep. Don't use singletons unless you have a lot of experience with them and they are absolutely needed. There is nothing in this code that suggests that you do need a singleton and Core Data definitely does not like them.




回答2:


Maybe you do something like

Item * items = [[Item alloc]initWithEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]insertIntoManagedObjectContext:context];

Edit -

because you aren't calling a good init method of NSManaged object in your custom init method. you could also clean that up to that to take a Context then call initWithEntity... on super there.



来源:https://stackoverflow.com/questions/5918703/failed-to-call-designated-initializer-on-nsmanagedobject-class-item

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!