【问题标题】:Core Data app crashes on savingCore Data 应用程序在保存时崩溃
【发布时间】:2013-08-06 10:23:23
【问题描述】:

我收到以下错误[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;
}

【问题讨论】:

  • 这个讨论和stackoverflow.com/questions/18072849/…一样吗?如果是这样,请删除此问题(或以前的问题)。
  • 而且上下文可能很有用。您要保存哪些数据?
  • 数据是带参数的请求。
  • 什么是TempObject,你是如何使用它的?它在您的错误消息中,但不会出现在您的代码中的任何位置。
  • 嗨@TomHarrington TempObject 是在当前控制器中导入的类。在 TempObject 中使用

标签: objective-c core-data nscoding


【解决方案1】:

错误消息表明您有一个名为TempObject 的类,您正尝试在其上调用encodeWithCoder:,并且该类没有实现该方法。如您所见,这是一个崩溃的错误。

您似乎在某处有一个可转换的核心数据属性,并且您正在为该属性分配一个TempObject 的实例。我不知道那在哪里。您的代码 sn-p 提到了一个可转换的属性,但您没有在代码中使用 TempObject 。我不知道这段代码是否实际上不是导致崩溃的原因,或者您是否出于某种原因手动更改了名称。

无论如何,当你有一个可变形的属性时,你必须做以下两件事之一:

  1. 让你的类符合NSCoding。你在评论中说你做了,但你的错误信息说你没有——或者至少,你没有完成工作。 NSCoding 定义了两个方法,initWithCoder:encodeWithCoder:,你的类必须实现这两个方法。

  2. 创建一个自定义的NSValueTransformer 子类,它可以将您的对象转换为NSData,并配置您的Core Data 模型以使用它。 Apple 提供了几个非常好的(但很简单)的例子来说明如何做到这一点。

您分配给可转换属性的任何内容必须执行其中一项。哪一个取决于你。

似乎您正在尝试做#1,但还没有完成工作。确保你的类符合NSCoding

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 1970-01-01
    相关资源
    最近更新 更多