gpt4 book ai didi

objective-c - -[NSCFNumber 计数] : unrecognized selector

转载 作者:太空狗 更新时间:2023-10-30 03:56:51 25 4
gpt4 key购买 nike

我有一些遵循 Apple 的 sample code 的核心数据代码准确地说(获取满足给定函数的属性值示例)。我用它来获取字段的最大值,这样我就可以在插入该实体类型的下一个对象时增加它。

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

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

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

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

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

更新

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

更新 2

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

更新 3

This post似乎有同样的问题,但他的解决方案没有意义。他将结果类型从 NSDictionaryResultType 更改为 NSManagedObjectResultType,这会产生不正确的结果。不是返回单个值(我正在寻找的 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;

最佳答案

显然这是一个已知错误,在使用 NSInMemoryStoreType 数据存储时会发生。使用 NSSQLiteStoreType 似乎效果很好。

You can find the OpenRadar entry here

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

关于objective-c - -[NSCFNumber 计数] : unrecognized selector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4387403/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com