2012-05-12 2 views
1

В моем коде есть класс (назовем его myRefLib), который наследуется от UIReferenceLibraryViewController (часть UIKit Framework), который является классом, доступным только в iOS 5 и выше. Я хотел бы иметь цель развертывания iOS 3.2.Унаследовано от слабосвязанных классов или классов iOS, не относящихся к цели развертывания iOS-версия

Если я просто создавал экземпляр UIReferenceLibraryViewController, я понимаю, что могу использовать базовый SDK из 5, а затем проверить, существует ли класс с [классом UIReferenceLibraryViewController] перед запуском любого кода, который его включает. Но как мне это сделать, если я наследую от класса?

Проблема в том, что я должен # включить класс наследования myRefLib для частей моего кода, который будет использовать его, но не существует способа условно сделать это во время выполнения. В качестве альтернативы также нет способа выполнения, условно наследуемого от UIReferenceLibraryViewController в myRefLib. Я также хотел бы сделать экземпляр myRefLib свойством другого класса - опять же, как я могу сделать это время выполнения условно?

Любая помощь очень ценится ...

D

ответ

1

Ну, во-первых, вы знаете, что вы собираетесь делать, когда работает на более ранних ОС. В принципе, вам нужно написать свой код, как если бы вы строили против iOS 3.2 SDK. Только после этого вы можете добавить дополнительные улучшения, используя новые функции.

Начиная с самой простой вещи: вам не требуется объявление интерфейса класса, чтобы объявлять переменные, включая переменные экземпляра, в качестве указателей на этот класс. Вам просто нужно опережающее объявление:

@class SomeClass; 
SomeClass* foo; 

Далее, не должно быть никаких проблем с импортом заголовок, который определяет ваш класс. Это время компиляции, которое, по вашему мнению, является проблемой, но это означает, что среда выполнения не влияет. Он будет скомпилирован, потому что вы строите против iOS 5.0 SDK.

Вещь, которую вы должны быть осторожны, заключается в том, чтобы не использовать класс, если он недоступен. Вы уже знаете, как проверить это: проверьте, возвращается ли [SomeClass class]Nil. Если это так, не создавайте свой собственный подкласс.

Наконец, вы указываете, что «время выполнения условно наследуется от UIReferenceLibraryViewController в myRefLib». Почему вы думаете, что вам нужно это сделать? Если UIReferenceLibraryViewController недоступен, то не имеет смысла хотеть использовать myRefLib, который подклассифицирует его. Если у вас есть альтернативная реализация, которая не зависит от UIReferenceLibraryViewController, тогда создайте отдельный класс. Затем условно выберите между myRefLib и другим классом в зависимости от доступности.

+0

Thanks Ken. Единственная причина, по которой я привел условное наследование, была альтернативой, если не было решения проблемы #include. Вы также отправили меня сюда, что касается некоторых деталей: http://www.marco.org/2010/11/22/supporting-older-versions-of-ios-while-using-new-apis ... показывает это нормально для подкласса, включать и указывать на отсутствующий класс, при условии соблюдения определенных условий и при условии, что вы не создаете экземпляр. – delany

+0

О, также метод класса [UIReferenceLibraryViewController dictionaryHasDefinitionForTerm: str] возвращает nil без сбоев, если класс UIReferenceLibraryViewController не существует. Итак, в случае этого конкретного класса, если вы уже проверяли, что слово существует до создания экземпляра (и при условии соблюдения вышеописанных условий), похоже, что нет необходимости изменять какой-либо код для более старых версий.Хотя я полагаю, что поведение словаряHasDefinitionForTerm не гарантируется в будущих версиях iOS, поэтому лучше всего добавить проверку [UIReferenceLibraryViewController class]. – delany

 Смежные вопросы

  • Нет связанных вопросов^_^