Символ не найден: _objc_class _ $ _ UipoPoverController
-
25-09-2019 - |
Вопрос
У меня проблемы с моим универсальным приложением. Я установил основу SDK на iPhone 3.2 и установить цель до 3.1.
Я переместил файлы, которые используют UipoPoverController к своим собственным файлам, и они не должны загружаться при загрузке приложения на iPhone. Тем не менее, когда я создаю свое приложение, я получаю следующую ошибку, когда я строю и отладку на мое устройство:
Dyld: Символ не найден: _objc_class _ $ _ UipoPoverController, указанный из: /var/mobile/applations/b3b90643-92dc-42d6d57e0/citybikes.app/cityBikes ожидается в: /system/library/frameworks/uikit.framework/uikit в /var/mobile/applications/b3b90643-92dc-4e5c-8b2f-83a42d6d57e0/citybikes.app/cityBikes.
Я действительно надеюсь, что кто-то может помочь мне.
С наилучшими пожеланиями, Пол Пиэлен
Решение
Даже если они не загружены во время выполнения, эти файлы все еще обрабатываются в связи с ссылкой. Символ _OBJC_CLASS_$_UIPopoverController
Поэтому добавляется в ваше приложение в качестве одного из тех, требующих динамического соединения.
Есть 2 обходных пути,
- Заменить все появление UipoPoverController в сообщении (например,
[UIPopoverController alloc]
) с участиемNSClassFromString(@"UIPopoverController")
, или - Сделать Uikit слабо связанным.
Другие советы
Я настоятельно рекомендую вам нет Слабо связывать Uikit. Как сказал Кеннитм, и я упомянул в наших комментариях, это может скрыть проблемы будущего линкера и привести к авариям. Мне также просто не удобно рассказывать линкеру, что Uikit не является обязательным, когда это не так. Большой взлом.
Вместо этого инициализируйте и вызовите UiPoPovoverController, косвенно используя NSClassFromString:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Если у вас все еще есть ошибки связи, вам может потребоваться позвонить в сообщения UipoPoverController, используя NSSELECTRICROMSTRING:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
Для мобильности я рекомендую написать прокси-объект для обработки этих деталей реализации.