0

次のエラーが発生しまし[context save:&error]た。どのように修正すればよいですか?

認識されないセレクターがクラスに送信されました * -[NSKeyedArchiver dealloc]: 警告: -finishEncoding が呼び出されずに NSKeyedArchiver が割り当て解除されました。*キャッチされない例外 '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;
}
4

1 に答える 1

2

エラー メッセージは、 という名前のクラスがありTempObject、それを呼び出そうとしencodeWithCoder:ていること、およびこのクラスはそのメソッドを実装していないことを示しています。ご覧のとおり、これはクラッシュするバグです。

どこかに変換可能な Core Data 属性がありTempObject、この属性に のインスタンスを割り当てているようです。それがどこにあるのかわかりません。コード スニペットは変換可能な属性について言及していますが、コードでは使用していませんTempObject。このコードが実際にクラッシュの原因ではないのか、それとも何らかの理由で手動で名前を変更したのかはわかりません。

とにかく、変換可能な属性を持っている場合は、次の 2 つのいずれかを行う必要があります。

  1. クラスを に準拠させNSCodingます。あなたはコメントでやったと言いましたが、あなたのエラーメッセージは、あなたがしていない、または少なくとも仕事を終えていないことを示しています. NSCodingは と の 2 つのメソッドを定義してinitWithCoder:おりencodeWithCoder:、クラスは両方を実装する必要があります。

  2. NSValueTransformerオブジェクトを との間で変換できるカスタム サブクラスを作成し、NSDataこれを使用するように Core Data モデルを構成します。Apple は、これを行う方法の非常に優れた (しかし単純な) 例をいくつか提供しています。

変換可能な属性に割り当てるものはすべて、これらのいずれかを実行する必要があります。どちらかはあなた次第です。

#1 を実行しようとしているようですが、まだ完了していないようですクラスが に準拠していることを確認してくださいNSCoding

于 2013-08-06T20:48:19.167 に答える