Парс iOS XCode: Имена классов не могут начинаться с нижнего подчеркивания

Вопрос или проблема

Я получаю эту ошибку при инициализации Parse. Скорее всего, это произошло из-за обновления до XCode версии 16.0 (16A242d). MacOS – 14.5 (23F79).

Я установил Parse в качестве pod. Также пробовал удалить его и установить последнюю версию как зависимость пакета, но ошибка осталась той же.

[Parse initializeWithConfiguration:[ParseClientConfiguration configurationWithBlock:^(id<ParseMutableClientConfiguration> configuration) {
            configuration.applicationId = @"myAppId";
            configuration.clientKey = nil;
            configuration.server = @"myParseServerUrlStringHostedonHeroku";
}]];

Вот что я получаю, когда запускаю приложение: (Ошибок при компиляции нет.)

*** Завершение работы приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: Недопустимое имя класса. Имена классов не могут начинаться с подчеркивания.'
*** Стек вызовов при первом выбросе:
(
    0   CoreFoundation                      0x00000001804ae0f8 __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x0000000180087db4 objc_exception_throw + 56
    2   CoreFoundation                      0x00000001804ae008 -[NSException initWithCoder:] + 0
    3   myApp.debug.dylib   0x0000000106d2f1f8 +[PFObject(Private) _assertValidInstanceClassName:] + 180
    4   myApp.debug.dylib   0x0000000106d37598 -[PFObject init] + 436
    5   myApp.debug.dylib   0x0000000106d37898 -[PFObject initWithObjectState:] + 92
    6   myApp.debug.dylib   0x0000000106d379cc +[PFObject objectWithClassName:objectId:completeData:] + 248
    7   myApp.debug.dylib   0x0000000106d37ae0 +[PFObject objectWithClassName:] + 80
    8   myApp.debug.dylib   0x0000000106d37fcc +[PFObject object] + 252
    9   myApp.debug.dylib   0x0000000106cf6bdc __56-[PFCurrentInstallationController getCurrentObjectAsync]_block_invoke.9 + 452
    10  myApp.debug.dylib   0x0000000106a64f18 __62-[BFTask continueWithExecutor:successBlock:cancellationToken:]_block_invoke + 124
    11  myApp.debug.dylib   0x0000000106a64848 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke + 88
    12  myApp.debug.dylib   0x0000000106a615c0 __29+[BFExecutor defaultExecutor]_block_invoke_2 + 152
    13  myApp.debug.dylib   0x0000000106a61da0 -[BFExecutor execute:] + 88
    14  myApp.debug.dylib   0x0000000106a64b24 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke.15 + 44
    15  myApp.debug.dylib   0x0000000106a642f4 -[BFTask runContinuations] + 508
    16  myApp.debug.dylib   0x0000000106a63cd8 -[BFTask trySetResult:] + 208
    17  myApp.debug.dylib   0x0000000106a65a50 -[BFTaskCompletionSource trySetResult:] + 88
    18  myApp.debug.dylib   0x0000000106ce88fc __28-[PFAsyncTaskQueue enqueue:]_block_invoke_2 + 216
    19  myApp.debug.dylib   0x0000000106a64848 __55-[BFTask continueWithExecutor:block:cancellationToken:]_block_invoke + 88
    20  libdispatch.dylib                   0x00000001022cbec4 _dispatch_call_block_and_release + 24
    21  libdispatch.dylib                   0x00000001022cd73c _dispatch_client_callout + 16
    22  libdispatch.dylib                   0x00000001022d05a0 _dispatch_queue_override_invoke + 1320
    23  libdispatch.dylib                   0x00000001022e136c _dispatch_root_queue_drain + 372
    24  libdispatch.dylib                   0x00000001022e1f18 _dispatch_worker_thread2 + 256
    25  libsystem_pthread.dylib             0x00000001022277d8 _pthread_wqthread + 224
    26  libsystem_pthread.dylib             0x00000001022265d4 start_wqthread + 8

После отладки, вот что вызвало проблему: В PFObject:

+ (instancetype)object {
    PFConsistencyAssert([self conformsToProtocol:@protocol(PFSubclassing)],
                        @"Можно вызывать +object только для подклассов, соответствующих PFSubclassing");
    NSString *className = [(id<PFSubclassing>)self parseClassName];
    Class class = [[self subclassingController] subclassForParseClassName:className] ?: [PFObject class];
    return [class objectWithClassName:className];
}

NSString *className = [(id<PFSubclassing>)self parseClassName]; в этой строке className оказывается “_Installation”, потому что в PFInstallation есть:

+ (NSString *)parseClassName {
    return @"_Installation";
}

Также, [[self subclassingController] subclassForParseClassName:className] возвращает nil.

Провел почти весь день на этом без перерывов и чувствую себя расстроенным. Все, что меня беспокоит, это то, что подклассы не регистрируются в Parse->Core->PFObjectSubclassingController:

- (void)registerSubclass:(Class<PFSubclassing>)kls {
    pf_sync_with_throw(_registeredSubclassesAccessQueue, ^{
        [self _rawRegisterSubclass:kls];
    });
}

что дает nil в [[self subclassingController] subclassForParseClassName:className].

Пожалуйста, помогите! Нужна помощь, спасибо!

Ответ или решение

К сожалению, ваша проблема, связанная с ошибкой "Invalid class name. Class names cannot start with an underscore", скорее всего, проистекает из того, что вы пытаетесь использовать или инициализировать класс Parse, название которого начинается с символа подчеркивания ("_"). В вашем случае это _Installation, что является встроенным классом Parse.

Возможные решения:

  1. Проверка инициализации классов Parse:
    Убедитесь, что вы корректно зарегистрировали все свои подклассы, которые наследуют от PFObject. Вы должны вызывать метод registerSubclass: для каждого своего класса перед тем, как вы начнете их использовать. Например:

    [PFInstallation registerSubclass];

    Если ваш подкласс не зарегистрирован, то subclassForParseClassName: вернёт nil, и это может привести к ошибке.

  2. Изменение имени класса:
    Если вы создаете собственный класс, убедитесь, что его имя не начинается с символа подчеркивания. Названия классов, начиная с _, зарезервированы для встроенных классов Parse.

  3. Обновление Parse SDK:
    Убедитесь, что вы используете последнюю версию SDK Parse, так как проблема может быть исправлена в более новой версии. Вы можете обновить его через CocoaPods или вручную.

    Для CocoaPods это можно сделать так:

    pod update Parse
  4. Проверка версии Xcode и зависимостей:
    Иногда обновление Xcode или зависимостей может привести к несовместимости между версиями. Проверьте документацию на предмет возможных изменений или обновлений, которые могли бы повлиять на вашу реализацию.

  5. Проверка конфигурации ParseClientConfiguration:
    Убедитесь, что конфигурация клиента инициализируется правильно, и все необходимые параметры (applicationId, clientKey, server) указаны корректно.

  6. Отладка кода:
    Если проблема сохраняется, добавьте дополнительные логи для отладки, чтобы убедиться, что вы видите корректные названия классов в момент инициализации и при включении подклассов. Это может помочь выявить нежелательные изменения или использование неверных названий классов.

Пример отладочной информации:

NSString *className = [(id<PFSubclassing>)self parseClassName];
NSLog(@"Class Name: %@", className);

При успешной реализации вышеуказанных шагов вы должны избавиться от проблемы с именами классов. Если проблема все еще остается, рекомендую обратиться к официальной документации Parse или сообществу для получения дополнительной информации.

Оцените материал
Добавить комментарий

Капча загружается...