我收到以下错误[context save:&error]
。我应该怎么解决?
无法识别的选择器发送给了课程 * - [NSKeyedArchiver dealloc]:警告:NSKeyedArchiver在没有调用-finishEncoding的情况下解除分配。 * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'+ [TempObject encodeWithCoder:]: 无法识别的选择器发送到类'
这里是我正在使用的代码。
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
PostRequest *postRequestObject = (PostRequest *)[NSEntityDescription insertNewObjectForEntityForName:@"PostRequest" inManagedObjectContext:context];
DummyClass *request = OtherClassObject;
postRequestObject.request = request;
// request is attribute with type transformable
NSLog(@"requestpost data -> %@",postRequestObject.request);
NSError *error = nil;
if (![context save:&error]) {
// Replace this implementation with code to handle the error appropriately.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
#pragma mark - private method
- (NSFetchedResultsController *)fetchedResultsController
{
if (_fetchedResultsController != nil)
{
return _fetchedResultsController;
}
NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PostRequest" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:80];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"status" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[sortDescriptor autorelease];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"root"] autorelease];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _fetchedResultsController;
}
答案 0 :(得分:2)
错误消息显示您有一个名为TempObject
的类,您尝试在其上调用encodeWithCoder:
,并且此类未实现该方法。正如你所见,这是一个崩溃的错误。
您似乎在某处具有可转换的Core Data属性,并且您正在为此属性分配TempObject
的实例。我不知道那是哪里。您的代码段提到了可转换的属性,但您未在代码中使用TempObject
。我无法判断这段代码是否真的是导致崩溃的原因,或者是否由于某种原因手动更改了名称。
无论如何,当你有一个可转换的属性时,你必须做以下两件事之一:
让您的课程符合NSCoding
。你在评论中说过,但你的错误信息表明你没有 - 或者至少你没有完成这项工作。 NSCoding
定义了两种方法,initWithCoder:
和encodeWithCoder:
,您的类必须同时实现这两种方法。
创建一个自定义NSValueTransformer
子类,可以将对象转换为NSData
,并配置核心数据模型以使用它。 Apple提供了几个非常好(但简单)的例子来说明如何做到这一点。
您为可转换属性指定的任何内容必须执行其中一项操作。哪一个取决于你。
似乎你正试图做#1但尚未完成这项工作。确保您的班级符合NSCoding
。