- [NSCFNumber count]: нераспознанный селектор - PullRequest
4 голосов
/ 08 декабря 2010

У меня есть некоторый код Core Data, который точно соответствует образцу Apple (значения атрибутов Fetching, которые удовлетворяют данной функции пример).Я использую его, чтобы получить максимальное значение поля, поэтому я могу увеличивать его, когда вставляю следующий объект этого типа сущности.

Я не мог заставить код работать вообще, покаЯ переключил тип магазина со NSXMLStoreType на NSSQLiteStoreType, и вдруг все, казалось, работало.Однако это не так.Я заметил, что он всегда будет возвращать одно и то же значение, даже когда я вставляю объекты с более высоким значением.Но после того, как я вышел и снова открыл (и таким образом данные были сохранены и прочитаны обратно), он обновится с новыми вставками.

Итак, я начал фиксировать и сохранять после каждой вставки.После первого «автосохранения» я получаю сообщение об ошибке ниже (дважды подряд):

- [NSCFNumber count]: нераспознанный селектор, отправленный экземпляру 0x100506a20

Это происходит (два раза подряд), когда я выполняю запрос на выборку один раз:

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

Обновление

Я пропустил свой код через инструмент Zombies и былвозможность взглянуть на объект, который получает ошибку.Вызов, который запускает malloc для его выделения: -[NSUserDefaults(NSUserDefaults) initWithUser:].Поскольку у меня не установлены собственные значения по умолчанию, я не знаю, какой это может быть объект.

Обновление 2

Я просмотрел все своикод для «выпуска» и закомментированные каждые release или autorelease, на которые статический анализатор не жаловался.Я все еще получил ошибки.Я даже зашел так далеко, что закомментировал каждый последний release / autorelease в своем коде, и все еще получил его.Теперь я почти уверен, что мой собственный код не переиздан.

Обновление 3

Этот пост , кажется, имеет то же самоепроблема, но его решение не имеет смысла.Он изменил тип результата с NSDictionaryResultType на NSManagedObjectResultType, что дает неверный результат.Вместо того, чтобы возвращать единственное значение (max, которое я ищу, которое возвращает каждый объект моего класса сущности в контексте управляемого объекта.

Вот самые верхние уровни стекаtrace (когда у меня это происходит в случае исключения, в первый раз):

#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;

Ответы [ 6 ]

11 голосов
/ 03 декабря 2012

По-видимому, это известная ошибка, возникающая при использовании хранилища данных NSInMemoryStoreType. Кажется, он работает нормально, используя NSSQLiteStoreType.

Вы можете найти запись OpenRadar здесь

Я заполнил дубликат для этой ошибки - я призываю людей, которые сталкиваются с той же проблемой, делать то же самое, чтобы повысить вероятность того, что это раздражающее поведение документируется (или даже лучше, исправляется).

3 голосов
/ 09 декабря 2010

Если у вас есть проблемы с управлением памятью (селекторы, отправленные в неправильные экземпляры, являются признаком проблем с управлением памятью), вы можете сделать следующее:

  1. Перечитать Какао правила управления памятью и убедитесь, что вы следуете им.
  2. Запустите статический анализатор .Это часто приводит к тому, что вы пренебрегали правилами управления памятью.
  3. Попробуйте использовать NSZombieEnabled, чтобы выяснить, [и когда] вы отправляете сообщения в нераспределенные экземпляры.*
1 голос
/ 25 августа 2012

Это также может произойти, если привязка установлена ​​неправильно. Например, если вы связываете логическое значение матрицы с «Content» вместо (или в дополнение к) «Selected Tag» в IB, вы можете получить эту ошибку.

Если ничего не помогает, отключите все привязки и подключите их по одному, чтобы узнать, кто из них является виновником.

1 голос
/ 08 декабря 2010

-[NSCFNumber count]: unrecognized selector sent to instance 0x100506a20 означает, что вы вызываете count для объекта NSCFNumber, но у NSCFNumber нет этого метода.Таким образом, наиболее вероятный счетчик отправляется на освобожденный объект NSArray или NSSet.Это может сказать вам, что происходит.Ищите SO для получения информации о том, как его установить.

0 голосов
/ 28 ноября 2012

Вы используете ключевой путь: sortOrder в своем выражении пути. По крайней мере, для баз данных XML Core-Data не может обрабатывать регистрозависимые типы. Измените свой путь на sortorder (все строчные буквы)

Возможно, вы столкнетесь с дальнейшими проблемами, если будете использовать классы контроллера.

0 голосов
/ 07 июня 2011

После того, как я испытал точно такую ​​же проблему с точно таким же примером кода, он, наконец, сработал для меня после того, как я вставил [request release] в .

...