Руководство по созданию собственной библиотеки для Cocoa (touch)
В настоящее время я использую много одинаковых объектов подкласса с настраиваемыми методами. Было бы удобнее создать мою собственную библиотеку, которую я могу использовать для нескольких проектов.
Цель состоит в том, чтобы мои собственные классы были доступны так же, как классы, такие как UIView
, CGRect
и т.д., включая удобные методы, такие как CGRectMake
, как с классами, так и с структурами. Чтобы подвести итог, я хочу создать свои собственные эквиваленты:
- Классы типа
UIView
- Структуры, такие как
CGRect
- Удобные функции, такие как
CGRectMake
- Предоставьте это доступное как библиотеку
- Имейте это доступное как шаблон XCode, таким образом, имея эти пользовательские объекты, доступные как "новые файлы" в XCode
Итак, в основном я ищу инструкции о том, как создавать классы, структуры и т.д., чтобы создать все вышеперечисленное. Каков наилучший способ сделать это? Проект 320 кажется хорошей отправной точкой. Но ему не хватает (я думаю) в:
- наличие библиотеки в новых проектах сразу.
- наличие новых классов, доступных под "новым файлом"
Даже если бы я создал собственную статическую библиотеку, , я смогу выпустить приложение в магазине приложений, так как привязка к сторонним библиотекам не поддерживается на телефоне?
Для вашего удобства это в основном вспомогательные вопросы, охватывающие сферу применения этого вопроса:
- Как создать собственную библиотеку для разработки Mac/iPhone?
- Как создать классы, структуры и встроенную функцию для этой библиотеки?
- Как создать собственный шаблон Xcode на основе этой библиотеки?
- Смогу ли я выпускать приложения для iPhone с помощью своей собственной статической библиотеки?
Ответы
Ответ 1
Если вы делали это для Mac, вы создали бы фреймворк. Однако вы указываете UIView
, поэтому, очевидно, вы работаете с iPhone. Apple не позволяет приложениям iPhone динамически связываться с другими библиотеками во время выполнения, поэтому ваш единственный вариант - создать статическую библиотеку. Статическая библиотека связана с исполняемым программным приложением.
Насколько мне известно, в Xcode нет шаблона проекта статической библиотеки. Скорее всего, вам придется начать с другого шаблона iPhone Xcode и добавить цель Static Library. Придерживайтесь целевой цели приложения по умолчанию; вы можете использовать это для создания простого тестового приложения, чтобы убедиться, что библиотека действительно работает.
Чтобы фактически использовать библиотеку в приложении, вам понадобятся две вещи: скомпилированная библиотека (она имеет расширение .a) и все файлы заголовков. В готовом приложении вы свяжетесь со своей статической библиотекой, и вам нужно будет #import
заголовочные файлы, чтобы компилятор понимал, какие классы, функции и т.д. Доступны для него. (Общим методом является создание одного заголовочного файла, который импортирует все остальные. Таким образом, вам нужно импортировать только один файл в исходные файлы.)
Что касается создания собственных пользовательских шаблонов, здесь есть простой учебник, который должен вас начать: http://www.macresearch.org/custom_xcode_templates Скорее всего, вы можете скопировать шаблоны по умолчанию и просто настроить их в соответствии с вашими потребностями.
Синтаксис структуры выглядит следующим образом:
typedef struct _MyPoint {
CGFloat x;
CGFloat y;
} MyPoint;
Структуры объявляются в заголовочных файлах, поэтому вы можете (я полагаю) Command + Double Нажмите на имя структуры, чтобы увидеть, как она объявлена.
Еще один маленький трюк для создания структур - это что-то вроде этого:
MyPoint aPoint = (MyPoint){ 1.5f, 0.25f };
Поскольку компилятор знает порядок полей в структуре, он может очень легко сопоставить значения, которые вы предоставляете в фигурных скобках, в соответствующие поля. Конечно, удобнее иметь такую функцию, как MyPointMake
, поэтому вы можете написать вот так:
MyPoint MyPointMake(CGFloat x, CGFloat y)
return (MyPoint){ x, y };
}
Обратите внимание, что это функция, а не метод, поэтому она живет вне контекста @interface
или @implementation
. Хотя я не думаю, что компилятор жалуется, если вы определяете его в контексте @implementation
.
CGPointMake
определяется как функция inline
. Вы можете увидеть определение для этого в заголовочных файлах Cocoa. (Разница между встроенной функцией и нормальной функцией заключается в том, что компилятор может заменить вызов CGPointMake
копией CGPointMake
, что позволяет избежать накладных расходов на выполнение вызова функции. Это довольно небольшая оптимизация, но для функция простая, она имеет смысл.)
Ответ 2
FYI Xcode 3.2 имеет новый шаблон проекта, называемый Cocoa Touch Static Library. Вы можете пойти по этому маршруту.
Ответ 3
Проект 320 - хороший пример библиотеки классов iPhone. Вы в основном компилируете свой проект в библиотеку .a, а затем статически связываете его с вашими проектами клиентов.
Ответ 4
Поскольку это сообщество wiki, я подумал, что будет полезно связать некоторые ресурсы и учебные пособия:
http://blog.stormyprods.com/2008/11/using-static-libraries-with-iphone-sdk.html
http://www.clintharris.net/2009/iphone-app-shared-libraries/
Наслаждайтесь!
Ответ 5
Проект 320 кажется действительно хорошей отправной точкой. Но ему не хватает (я думаю) в:
- наличие библиотеки в новых проектах сразу.
- наличие новых классов, доступных под "новым файлом"
Это шаблоны проектов и файлов. Для получения дополнительной информации обратитесь к Google.
Ответ 6
Если вы планируете освободить это в магазине приложений, вы не сможете использовать свою библиотеку так, как вам хотелось бы. Как упоминалось выше, ссылка на сторонние библиотеки не поддерживается на телефоне. Я думаю, что есть "взломанный" способ заставить его работать, но вы потеряете распространение.
Лучшее, что я мог придумать, заключалось в том, чтобы поместить весь соответствующий код в каталог и поделиться им таким образом. Я знаю, что это не так элегантно, но его ограничение, т.е. вне нашего контроля.