我正在为客户端 - 服务器应用程序进行通信,并且有一些奇怪的问题。 这是我拾取物品的代码。
- (byref NSArray*)objectsOfName:(bycopy NSString*)name
withPredicate:(bycopy NSPredicate*)predicate;
{
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:name
inManagedObjectContext:context]];
[request setPredicate:predicate];
NSArray *results = [context executeFetchRequest:request error:&error];
[request release], request = nil;
if (error) {
NSLog(@"%@:%@ Error on fetch %@", [self class], NSStringFromSelector(_cmd), error);
return nil;
}
//NSLog(@"%@:%@ Result of fetch is %@", [self class], NSStringFromSelector(_cmd), results);
return results;
}
这是皮卡:
NSArray *destinations;
#ifdef SNOW_CLIENT
destinations = [server objectsOfName:@"DestinationsListWeBuy" withPredicate:predicate];
如果我这样做 的NSLog(@ “目的地:%@ \ n”,目的地); 我在日志中看到了所有对象。 如果我试着做
NSLog(@"all:%@\n%@\n%@\n",[[destinations objectAtIndex:0] valueForKey:@"rate"],[[destinations objectAtIndex:0] valueForKey:@"lastUsedACD"],[[destinations objectAtIndex:0] valueForKey:@"lastUsedCallAttempts"]);
我也看到了属性。 但是,如果我尝试围绕对象循环:
for (NSManagedObject *dest in destinations)
{
NSLog(@"all:%@\n%@\n%@\n",[dest valueForKey:@"rate"],[dest valueForKey:@"lastUsedACD"],[dest valueForKey:@"lastUsedCallAttempts"]);
我在这部分代码中有EXC_BAD_ACCESS:
for (NSManagedObject *dest in destinations)
我所知道的所有调试技术都没有让我理解发生了什么。 (NSZombieEnabled = YES)
如果我以另一种方式循环:
for (NSUInteger count = 0;count < [destinations count]; count++)
NSLog(@"all:%@\n%@\n%@\n",[[destinations objectAtIndex:count] valueForKey:@"rate"],[[destinations objectAtIndex:count] valueForKey:@"lastUsedACD"],[[destinations objectAtIndex:count] valueForKey:@"lastUsedCallAttempts"]);
我看到所有的钥匙无一例外。所有nsmanagedobject都是子类。 如果我需要为所有子类实现encodeWithCored方法,可以举例说明。
* 更新Marcus * 这就是我从服务器端接收对象的方式:
- (byref NSArray*)allObjects
{
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValue:@"Failed to initialize the store" forKey:NSLocalizedDescriptionKey];
[dict setValue:@"There was an error building up the data file." forKey:NSLocalizedFailureReasonErrorKey];
NSError *error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
[[NSApplication sharedApplication] presentError:error];
return nil;
}
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:coordinator];
[moc setUndoManager:nil];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(mergeChangesForClient:)
name:NSManagedObjectContextDidSaveNotification
object:thirdMOC];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Carrier"
inManagedObjectContext:moc];
[request setEntity:entity];
[request setIncludesSubentities:YES];
NSError *error = nil;
NSArray *objects = [moc executeFetchRequest:request error:&error];
[request release], request = nil;
for (NSManagedObject *carrier in objects) {
NSSet *destinations = [carrier valueForKeyPath:@"destinationsListForSale"];
for (NSManagedObject *destination in destinations) [destination addObserver:self forKeyPath:@"rate" options:NSKeyValueObservingOptionNew context:nil];
}
if (error) {
NSLog(@"%@:%@ error: %@", [self class], NSStringFromSelector(_cmd), error);
return nil;
}
return objects;
}
这就是我在客户端对他们所做的事情:
NSArray *allObjects = [server allObjects];
[carrierArrayController setContent:allObjects];
在这种情况下没有序列化。任何其他方式(如将服务器moc发送到客户端的副本都不起作用,它只是在main.c上生成异常)。
P.S。非常感谢Marcus的核心数据书。
答案 0 :(得分:0)
无法识别的选择器发送到类0x1000a2ed8 2011-03-17 02:15:18.566 snowClient [19380:903] + [AppDelegate encodeWithCoder:]:无法识别的选择器发送到类0x1000a2ed8
这不是核心数据问题。这是您的代码中的错误,您尝试在不响应该方法的对象上调用方法。您需要在出现时跟踪它,以确定您正在尝试序列化AppDelegate。
什么类是0x1000a2ed8?打破异常并打印出对象以查看它是什么。同样,这不是直接的核心数据错误,而是向不响应该消息的对象发送消息。 Core Data可能不再允许您将受管对象作为分布式对象发送。这可能仅仅是过度释放对象的问题。没有进一步调查就无法知道。
第一步:找出对象0x1000a2ed8是什么,看看对象是否从一次运行变为另一次运行。