Почему происходит сбой проверки [класса NSMetadataQuery] на iOS 4.2.1?
Я пытаюсь использовать этот подход, описанный Марко Арментом, для проверки существования класса перед его использованием. При правильных настройках классы автоматически становятся слабосвязанными, когда это необходимо. Как описывает Марко, "вы можете безопасно создавать подклассы или иметь указатели на то, что вы хотите (если вы будете осторожны, чтобы не создавать их экземпляры, когда они недоступны)".
Мое приложение отлично работает на iOS 5. Я выполнил условия, указанные в ссылке:
- Базовый SDK - последняя версия iOS (iOS 5.1)
- Цель развертывания - iOS 4.0
- Компилятором для C/C++/Objective-C является компилятор Apple LLVM 3.1 (также пробовал LLVM GCC 4.2)
Каждый раз, когда я ссылаюсь на NSMetadataQuery, я сначала проверяю, существует ли класс:
if ([NSMetadataQuery class] != nil) …
Несмотря на все это, мое приложение сразу запускается, если я пытаюсь запустить его на iPod touch с iOS 4.2.1:
dyld: Symbol not found: _OBJC_CLASS_$_NSMetadataQuery
Я пытался закомментировать весь код любого моего приложения работает нормально. Как только я добавляю обратно в единую ссылку на NSMetadataQuery, он вылетает. Я даже попробовал это:
if ([NSMetadataQuery class] != nil) NSLog(@"OK");
Простое включение этой строки и отсутствие других ссылок на NSMetadataQuery приводит к сбою приложения. Еще более странно, что проверка других классов iOS 5 не вызывает проблем:
if ([UIDictationPhrase class] != nil) NSLog(@"OK");
Это работает нормально, как и ожидалось.
Я смог обойти проблему, используя более уродливый NSClassFromString()
чтобы убедиться, что класс существует, но я хотел бы знать, почему другой подход не работает.
2 ответа
У меня нет объяснения этому, но я столкнулся с той же проблемой, что и вы. Неважно, что я / вы делаете, NSMetadataQuery просто не будет слабо связан...
Обратитесь к этому ответу, который является действительно лучшим в другом вопросе:
/questions/29530439/prilozhenie-iphone-icloud-padaet-pri-kompilyatsii-na-ios-4/29530451#29530451
Короче, другие авто слабые ссылки вроде бы работают, просто NSMetadataQuery*
что вы должны удалить из источника и заменить на id
, Создайте класс с NSClassFromString()
и т.д. Нет икоты на других классах, таких как UIDocument
тем не менее, так что вы можете безопасно использовать их в обычном режиме без пота.
NSMetadataQuery
доступно в iOS 5.0 и выше, поэтому любые версии ниже, которые не имеют ни малейшего представления о том, что это такое. Просто используя его в своем коде, имя класса будет добавлено в таблицу символов и проверено при запуске приложения.