Weak Linking Foundation и UIKit?

Недавно я представил печать через AirPrint, но не хотел отказываться от поддержки версий до 4.2 (очевидно). Делал это раньше для таких вещей, как Game Center и т. Д. Что мне показалось особенно странным в этом случае, так это то, что мне пришлось ослабить ссылку на UIKit. Печать не содержалась в собственных рамках, что позволяло мне быть более детализированным.

Это просто казалось неправильным, хотя это решает мою проблему, позволяя приложению работать должным образом во всех версиях.

В Руководстве по совместимости SDK от Apple они государство:

При использовании инфраструктуры, доступной в вашей цели развертывания, вам следует потребовать эту структуру (а не связывать ее слабо).

UIKit доступен, но не классы, такие как UIPrintInfo, UIPrintInteractionController и т. Д.

Я прав, что кажется странным слабое связывание такой базовой структуры? Есть ли способ лучше?


person MarkPowell    schedule 06.01.2011    source источник
comment
ты уже нашел на это ответ? Кажется, что использование NS_CLASS_AVAILABLE нормально, если вы еще не объявили тип класса и сначала протестируете его. отработав эти 2 ссылки: goo.gl/6yH4U и goo.gl/FiOd9 Я до сих пор не нашел подходящего решения.   -  person John Wang    schedule 30.01.2011


Ответы (1)


Существует лучший способ. В iOS 4.2 для этой цели введен NS_CLASS_AVAILABLE, но есть некоторые ограничения на его использование. Все подробности перечислены в документации по ссылке ниже:

http://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/cross_development/Using/using.html

person Steven Kramer    schedule 06.01.2011
comment
Чтобы сделать это более конкретным: протестируйте во время выполнения, используя [UIPrintInfo class], если это возвращает nil, вы используете более старую систему и должны пропустить / отключить ваши функции печати. - person Steven Kramer; 07.01.2011
comment
@ Стивен Крамер: У меня такая же проблема. Я использую - (BOOL) canPrint {BOOL result = NO; Класс printClass = (NSClassFromString (@UIPrintInteractionController)); если (printClass! = ноль) {результат = [UIPrintInteractionController isPrintingAvailable]; } вернуть результат; }. Затем я тестирую [самопечать], чтобы включить / выключить функцию печати, но она не работает. Пробовал на ipod touch с ios 3.1.3. Я пробовал также с NSClassFromString (@UIPrintInfo), но ничего. Есть ли у вас какие-нибудь предложения? - person Sefran2; 30.05.2011
comment
Что вы имеете в виду под словом «не работает»? Ошибки при связывании? Ошибки динамического связывания? Или тест просто возвращает NO, где должен возвращать YES, или наоборот? - person Steven Kramer; 30.05.2011
comment
@Steven Kramer: Когда я запускаю приложение, в отчете о сбое говорится: Dyld Сообщение об ошибке: Символ не найден: _OBJC_CLASS _ $ _ UIPrintInfo Ссылка на: /var/mobile/Applications/403A2A5D-2DAC-4DFC-83B5-5800A25890AB/MyApp.app/ MyApp Ожидается в: /System/Library/Frameworks/UIKit.framework/UIKit в /var/mobile/Applications/403A2A5D-2DAC-4DFC-83B5-5800A25890AB/MyApp.app/MyApp Dyld Версия: 149. Я не связываю слабо фреймворк uikit, потому что в яблочном документе говорится: при использовании фреймворка, доступного в вашей цели развертывания, вы должны потребовать эту фреймворк (а не связывать его слабо). - person Sefran2; 30.05.2011
comment
Вы выполнили все настройки параметров сборки, перечисленные в этом документе, например, какой компилятор использовать и т. Д.? - person Steven Kramer; 31.05.2011
comment
Кстати, вы всегда можете сделать UIKit слабым звеном, если столкнетесь с проблемой. - person Steven Kramer; 31.05.2011
comment
@Steven Kramer: Теперь я изменил компилятор на LLVM-GCC 4.2, и он работает. Но я не понимаю, неправильно ли я прочитал документы или документы содержат ошибки ... Я имею в виду ... Я использую NSClassFromString, а не [класс UIPrintInteractionController]. Однако спасибо. Теперь я должен понять, может ли это изменение компилятора повлиять на производительность или нет. - person Sefran2; 31.05.2011
comment
Фрэн, стандартный GCC просто не поддерживает слабые ссылки! Компилятору необходимо специально пометить некоторые символы как слабосвязанные, а стандартный GCC этого не сделает. Удачи с вашим проектом. - person Steven Kramer; 31.05.2011