Arhn - архитектура программирования

[__NSDate objCType]: нераспознанный селектор

Иногда я получал ошибку, говоря, что нераспознанный селектор objcType был отправлен объекту NSDate:

2011-06-11 14: 44: 51.589 MyApp [354: 307] - [__ NSDate objCType]: нераспознанный селектор отправлен в экземпляр 0x4b0d5a0

2011-06-11 14: 44: 51.732 MyApp [354: 307] * Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [__ NSDate objCType]: нераспознанный селектор отправлен в экземпляр 0x4b0d5a0'

Я загружаю данные из sqLite с помощью Core Data, вызывая [[self fetchedResultsController] performFetch:&error]. Я использую предикат, который обеспечивает выборку единственных (NSManaged) объектов, имеющих свой атрибут kickoffTime типа NSDate в указанном диапазоне:

NSDate * fromDate = ...
NSDate * toDate = ...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"( ( %@ <= kickoffTime +0 ) && ( kickoffTime +0 <= %@ ) )", fromDate, toDate];

// Add the predicate to the fetchRequest
[[[self fetchedResultsController] fetchRequest] setPredicate:predicate];

NSError *error;

if (![[self fetchedResultsController] performFetch:&error]) 
{
    ...
}

Я действительно не знаю, в чем может быть проблема. Я, вероятно, каким-то образом неправильно использую предикат основных данных, заставляя фреймворк отправлять сообщение objCType объекту NSDate, чтобы узнать тип объекта. Есть ли у кого-нибудь предложения?

Вот несколько вещей, которые я заметил:

  • объект NSDate, на который отправляется проблемный селектор, является атрибутом kickoffTime моего NSManagedObject
  • это происходит довольно случайно, поэтому воспроизвести его нелегко
  • объект NSDate, которому отправляется нераспознанный селектор, кажется действительным объектом (я мог бы распечатать его в gdb)

Вот вершина стопки:

0 CoreFoundation 0x3587a987 __exceptionPreprocess + 114

1 libobjc.A.dylib 0x34a8249d objc_exception_throw + 24

2 CoreFoundation 0x3587c133 - [NSObject (NSObject) doesNotRecognizeSelector:] + 102

3 CoreFoundation 0x35823aa9 пересылка + 508

4 CoreFoundation 0x35823860 _CF_forwarding_prep_0 + 48

5 Foundation 0x3121ac69 + [_ NSPredicateUtilities add: to:] + 40

6 Foundation 0x31221225 - [выражение NSFunctionExpressionValueWithObject: context:] + 688

7 Foundation 0x3117e045 - [NSComparisonPredicate оценитьWithObject: substitutionVariables:] + 176

8 Foundation 0x312255fb - [NSCompoundPredicateOperator AssessmentPredicates: withObject: substitutionVariables:] + 186

9 Foundation 0x3121e43f - [NSCompoundPredicate оценитьWithObject: substitutionVariables:] + 186

10 Foundation 0x3117df8d - [NSPredicate оценитьWithObject:] + 16

11 CoreData 0x356e8edf - [NSManagedObjectContext executeFetchRequest: error:] + 2014

12 CoreData 0x357a041b - [NSFetchedResultsController performFetch:] + 766

13 MyApp 0x000195ef - [MatchesCalendarDataSource loadMatchesFrom: to: delegate:] + 138


  • Что +0 во время начала матча +0? Что будет, если вы его уроните? 15.08.2011
  • @Yuyi, именно то, что я подумал: сбросьте +0. 15.08.2011
  • Вы используете FetchedResultsController в другом потоке или в ситуации, когда другой поток может быть порожден для выполнения работы. Если ваш MOC принадлежит другому потоку, это произойдет. 15.08.2011
  • Спасибо за предложение! Он действительно работал с +0, но я постараюсь удалить его, поскольку он служил для некоторых проблем с обратной совместимостью. 15.08.2011
  • @Waren Спасибо, что указали на это. Доступ к MOC должен осуществляться только в основном потоке, но я дважды это проверю. Вы сталкивались с подобными проблемами раньше? И если да, то было ли причиной плохое использование MOC в многопоточной среде? 15.08.2011
  • хотя на этот вопрос уже был дан ответ, я тоже сталкиваюсь с подобной проблемой. Когда что-то происходит случайно и с причудливыми сообщениями об ошибках, это обычно проблема управления памятью какого-то освобожденного объекта, например, как вы вычисляете fromDate, toDate? Я решил сделать три вещи: запустить анализатор, запустить профилировщик с включенным зомби и переписать свои методы для принятия [entity objectID] вместо самой сущности, что могло вызвать проблемы в многопоточной среде, как говорится в документации Apple. 16.08.2011

Ответы:


1

objcType - это селектор / метод NSValue и его подклассов, таких как NSNumber. Это означает, что объект NSDate в какой-то момент обрабатывается как NSValue. Скорее всего, это происходит, когда NSDate вклинивается в математическую операцию, которую он не поддерживает.

В предикате NSDate часто преобразуется в NSTimeInterval, который является двойным. Если вы зарегистрируете указанный выше предикат, дата будет иметь следующий вид:

CAST(335110182.022141, "NSDate") <= kickoffTime + 0 AND kickoffTime + 0 <= CAST(335110182.022141, "NSDate")

... что NSDate приводится к двойному. Вот откуда взялась ваша проблема. Я подозреваю, что это происходит потому, что синтаксический анализатор предикатов не всегда может определить приоритет.

Вероятно, вы можете решить проблему, просто:

(CAST(335110182.022141, "NSDate") <= kickoffTime + 0) AND (kickoffTime + 0 <= CAST(335110182.022141, "NSDate"))

Однако +0 абсолютно ничего не делает в предикате, кроме проблем, поэтому я просто потеряю его.

Кстати, когда вы говорите:

Что я делаю, так это загружаю данные из sqLite с использованием Core Data, вызывая

... что наводит на мысль, что вы думаете о Core Data как об оболочке объекта для sqlite. Это не так, и, думая об этом, вы столкнетесь, особенно с предикатами.

15.08.2011
  • Спасибо за пояснение, что там происходит. Не уверен, поможет ли удаление +0. Мне просто интересно, почему этот синтаксический анализатор иногда (в подавляющем большинстве случаев, поскольку его трудно воспроизводить) выполняет синтаксический анализ нормально, а иногда и возникают проблемы. 16.08.2011
  • Приведение, вероятно, не выполняется в зависимости от фактического значения NSTimeInterval объекта NSData, например. если бы это было что-то вроде 192837465.0, оно могло бы быть проанализировано как целое число, а не как двойное. Могли ли вы случайно присвоить NSNumber переменной данных или наоборот? 16.08.2011
  • Я не уверен, вызывает ли +0 проблему или нет, но его нужно удалить, потому что он не выполняет никакой функции в предикате. Это просто беспорядок. 16.08.2011
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..