4

我有一些核心数据代码完全遵循 Apple 的示例代码获取满足给定函数示例的属性值)。我使用它来获取字段的最大值,因此我可以在插入该实体类型的下一个对象时增加它。

我根本无法让代码工作,直到我将我的 Store Type 从 切换NSXMLStoreTypeNSSQLiteStoreType,然后突然之间一切似乎都正常了。然而,事实并非如此。我注意到它总是会返回相同的值,即使我插入了更高的对象。但是,在我退出并重新打开后(因此数据被持久化并读回),它会用新的插入更新。

所以我开始在每次插入后提交和保存。不过,在第一次“自动保存”之后,我收到以下错误(连续两次):

-[NSCFNumber count]:无法识别的选择器发送到实例 0x100506a20

当我执行一次获取请求时,会发生这种情况(连续两次):

NSArray *objects = [context executeFetchRequest:request error:&error];

更新

我通过 Zombies 工具运行了我的代码,并且能够查看出现错误的对象。malloc运行分配它的调用是: -[NSUserDefaults(NSUserDefaults) initWithUser:]. 由于我没有设置任何自己的默认值,我不知道这可能是什么对象。

更新 2

我在我的所有代码中搜索“发布”并注释掉静态分析器没有抱怨的每一个release或。autorelease我仍然得到错误。我什至在我的代码中注释掉最后一个release/ autorelease,但仍然得到它。现在我相当确定我自己的代码没有过度发布。

更新 3

这个帖子似乎有同样的问题,但他的解决方案没有意义。他将结果类型从 更改NSDictionaryResultTypeNSManagedObjectResultType,这会产生不正确的结果。而不是返回单个值(max我正在寻找的,它返回托管对象上下文中我的实体类的每个对象。

这是堆栈跟踪的最顶层(当我第一次让它在异常中中断时):

#0  0x7fff802e00da in objc_exception_throw
#1  0x7fff837d6110 in -[NSObject(NSObject) doesNotRecognizeSelector:]
#2  0x7fff8374e91f in ___forwarding___
#3  0x7fff8374aa68 in __forwarding_prep_0___
#4  0x7fff801ef636 in +[_NSPredicateUtilities max:]
#5  0x7fff800d4a22 in -[NSFunctionExpression expressionValueWithObject:context:]
#6  0x7fff865f2e21 in -[NSMappedObjectStore executeFetchRequest:withContext:]
#7  0x7fff865f2580 in -[NSMappedObjectStore executeRequest:withContext:]

我在网上其他地方的许多论坛上都看到过这个问题,但没有人提供可行的解决方案。应普遍要求,我在下面添加了自己的代码。稍微解释一下,我的实体名称是Box,我试图获取的属性是“sortOrder”,一个Int 32属性。

NSManagedObjectContext *context = [MyLibrary managedObjectContext];

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Box"
                               inManagedObjectContext:context]];

// Specify that the request should return dictionaries.
[request setResultType:NSDictionaryResultType];

// Create an expression for the key path.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"sortOrder"];

// Create an expression to represent the function you want to apply
NSExpression *expression = [NSExpression expressionForFunction:@"max:"
                                                     arguments:[NSArray arrayWithObject:keyPathExpression]];

// Create an expression description using the minExpression and returning a date.
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];

// The name is the key that will be used in the dictionary for the return value.
[expressionDescription setName:@"maxSort"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSInteger32AttributeType];

// Set the request's properties to fetch just the property represented by the expressions.
[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];

// Execute the fetch.
NSError *error;
NSNumber *requestedValue = nil;
NSArray *objects = [context executeFetchRequest:request error:&error];
NSLog( @"objects: %@", objects );
if (objects != nil && [objects count] > 0) {
    requestedValue = [[objects objectAtIndex:0] valueForKey:@"maxSort"];
} else {
    [[NSApplication sharedApplication] presentError:error];
}

[expressionDescription release];
[request release];

NSLog( @"Max Sort Order: %@", requestedValue );
return requestedValue;
4

6 回答 6

12

显然这是一个已知的错误,在使用 NSInMemoryStoreType 数据存储时会发生。使用 NSSQLiteStoreType 似乎可以正常工作。

您可以在此处找到 OpenRadar 条目

我为这个错误填写了一份副本——我鼓励遇到相同问题的人也这样做,以增加这种烦人行为被记录(甚至更好,被修复)的可能性。

于 2012-12-03T10:42:00.013 回答
3

当您遇到内存管理问题时(选择器被发送到错误的实例是内存管理问题的标志),您可以做很多事情:

  1. 重新阅读 Cocoa内存管理规则并确保您遵循它们。
  2. 运行静态分析器。这通常会发现您忽略了内存管理规则的地方。
  3. 尝试使用NSZombieEnabled来了解您是否 [以及何时] 向未分配的实例发送消息。
于 2010-12-08T21:49:17.767 回答
1

-[NSCFNumber count]: unrecognized selector sent to instance 0x100506a20意味着,您正在对 NSCFNumber 对象调用 count,但 NSCFNumber 没有此方法。所以最有可能的计数是发送到一个释放的 NSArray 或 NSSet 对象。

使用NSZombieEnabled = YES。它可能会告诉你,会发生什么。搜索 SO 以获取有关如何设置它的信息。

于 2010-12-08T13:17:33.257 回答
1

如果绑定设置不正确,也会发生这种情况。例如,如果您将矩阵布尔值绑定到“内容”而不是(或除了)IB 中的“选定标签”,您可能会收到此错误。

如果一切都失败了,请断开所有绑定并一次重新连接它们,看看哪个是罪魁祸首。

于 2012-08-25T16:02:04.623 回答
0

您正在使用 key path:sortOrder在您的路径表达式中。至少对于 XML-Databases Core-Data不能处理区分大小写的类型。将路径更改为sortorder(全部小写)

如果您使用控制器类,您可能会遇到更多问题。

于 2012-11-27T21:53:04.233 回答
0

在使用完全相同的示例代码遇到完全相同的问题后,在我[request release] 输入.

于 2011-06-07T01:44:57.653 回答