【发布时间】:2012-03-15 01:36:20
【问题描述】:
在核心数据中,我设置了一个名为 GolferEntity 的简单实体,它仅包含一个 golferObject(可转换类型)和 playerId(字符串)。
- (void)addOrUpdateGolfer:(GolferObject *)feedObj
{
NSLog(@"In add or update Feed");
// get reference to local (stored) golfer item, create it if needed
Golfer *localGolfer = [self golferForId:[feedObj PlayerId]];
if (localGolfer == nil) {
localGolfer = (Golfer *)[NSEntityDescription insertNewObjectForEntityForName:@"GolferEntity" inManagedObjectContext:[self managedObjectContext]];
[localGolfer setPlayerId:[feedObj PlayerId]];
}
// set folder fields
[localGolfer setGolferObj:feedObj];
// apply update
NSError *error;
if (![managedObjectContext save:&error]) {
NSLog(@"%@", [error localizedDescription]);
// return nil;
}
NSLog(@"successfully saved user: %@", [feedObj PlayerId]);
//return localFolder;
}
代码给了我一个运行时错误,内容如下: * -[NSKeyedArchiver dealloc]:警告:NSKeyedArchiver 在没有调用 -finishEncoding 的情况下被释放。 * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[GolferObject encodeWithCoder:]: unrecognized selector sent to instance 0x4b7520”
-- 在我的代码中没有分配 NSKeyedArchiver,所以我假设这是由核心数据完成的?我的 GolferObject 也没有 encodeWithCoder 方法吗?我不知道这是从哪里来的?
【问题讨论】:
-
您是否得到了 -[NSKeyedArchiver dealloc] 警告的回溯?在 Xcode 中的 -[NSKeyedArchiver dealloc] 上设置断点,以便您可以看到调用的来源。
-
我没有在我的代码中任何地方写过“NSKeyedArchiver”。这就是问题所在。我对这个问题的来源/来源一无所知。我假设可转换类型属性可以包含自定义对象来构建实体。
-
对,听起来 NSKeyedArchiver 是由您正在使用的类或框架管理的。尽管您不直接对 NSKeyedArchiver 对象负责,但您的代码可能会出现以这种无益的方式表现出来的错误。如果设置断点并获得回溯,这可以作为调试的起点。
-
您解决了吗?我也有同样的问题。
-
是的,我需要在提交到 CoreData 中的自定义对象之前进行编码。我需要使用 - (void)encodeWithCoder:(NSCoder *)encoder;和 - (id)initWithCoder:(NSCoder *)decoder;方法。
标签: ios core-data nskeyedarchiver