Символ не найден: _OBJC_CLASS _ $ _ UIPopoverController - PullRequest
16 голосов
/ 09 июня 2010

У меня проблемы с универсальным приложением. Я установил Базовый SDK на iPhone 3.2 и установил цель на 3.1.

Я переместил файлы, использующие UIPopoverController, в свои файлы, и их не следует загружать при загрузке приложения на iPhone. Тем не менее, когда я собираю свое приложение, я получаю следующую ошибку при сборке и отладке на моем устройстве:

dyld: Символ не найден: _OBJC_CLASS _ $ _ UIPopoverController Ссылка от: /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes Ожидается в: /System/Library/Frameworks/UIKit.framework/UIKit в /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

Я действительно надеюсь, что кто-то может мне помочь.

С уважением, Пол Пилен

Ответы [ 2 ]

27 голосов
/ 09 июня 2010

Даже если они не загружены во время выполнения, эти файлы все равно обрабатываются в ссылках. Поэтому символ _OBJC_CLASS_$_UIPopoverController добавляется в ваше приложение как один из тех, которые требуют динамического связывания.

Есть 2 обходных пути,

  1. Заменить все появление UIPopoverController в сообщении (например, [UIPopoverController alloc]) на NSClassFromString(@"UIPopoverController"), или
  2. Сделать UIKit слабо связанным.
4 голосов
/ 20 октября 2011

Я настоятельно рекомендую вам не слабую ссылку UIKit. Как мы упоминали в наших комментариях KennyTM, это может скрыть будущие проблемы компоновщика и привести к сбоям. Мне также просто не нравится говорить компоновщику, что UIKit является необязательным, когда это явно не так. Большой хак.

Вместо этого инициализируйте и вызовите UIPopoverController косвенно, используя NSClassFromString:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}

Если у вас все еще есть ошибки компоновщика, вам может потребоваться вызвать сообщения UIPopoverController с помощью NSSelectorFromString:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}

Для переносимости я рекомендую написать прокси-объект для обработки этих деталей реализации.

...