Разделение классов между проектами в xcode/objective-c

У меня есть клиент <=> приложение для сервера, которое я строю для Mac OS X, используя Objective-c/Cocoa и XCode. Я создал другой проект и для приложений, которые я имею, и я задаюсь вопросом лучший способ разделить классы между ними. Есть несколько классов, которые я сделал, который был бы полезен для обоих. Настолько далеко я копировал их вокруг, но я чувствую, что это не лучшее решение.

Как я разделяю классы эффективно? Я должен сделать заново его как 1 проект и просто иметь два, строят цели? Как я делаю это?

Какая-либо другая информация?

Спасибо.

30
задан Allyn 24 January 2010 в 08:11
поделиться

5 ответов

Если у вас есть два или более продуктов, которые будут совместно использовать большое количество общего кода, например набор продуктов, вы можете подумать о создании только одного проекта xcode, а затем добавить отдельная цель для каждого продукта, которая будет построена как на общем, так и на специфическом для продукта коде. С большим количеством общего кода пара продуктов клиент / сервер, возможно, будет отличным кандидатом для этого.

Вкратце, основная сделка заключается в том, что для каждой цели в вашем проекте xcode, который вы хотите построить, вы указываете, какие файлы должны использоваться для его сборки: исходные файлы, искусство, xibs и так далее. Таким образом, например, вы можете настроить свой клиентский продукт на сборку с использованием файлов A, B, C, D, E, F, а ваш серверный продукт на сборку с использованием файлов A, F, X, Y, Z.

Мне очень нравится, когда каждый связанный продукт находится под одной «крышей» проекта xcode, потому что вам не придется прыгать по проектам xcode, и это действительно упрощает управление SCM для общих файлов.

Вот ссылка на документы Apple по этому поводу: https://developer.apple.com/library/mac/#featuredarticles/XcodeConcepts/Concept-Targets.html

Обновление: есть немного дополнительных хлопоты, связанные с настройкой целевых файлов заголовков в xcode (это всегда что-то ... верно ?!); например, используйте myHeaderA.h для этой цели и myHeaderB.h "для этой цели. Вот отличный пост, в котором рассказывается, как это сделать: контроль того, какой файл заголовка проекта Xcode будет включать . Внимание: после того, как вы настроили все таким образом, xcode больше не знает никаких путей для поиска для любого из ваших целевых файлов заголовков, поэтому вам придется настроить их вручную. Для этого щелкните правой кнопкой мыши Get Info на своей цели, выберите категорию сборки, затем добавьте свои пути с помощью параметра «Пути поиска заголовков». выполнялся поиск в том порядке, в котором вы их вводили.

14
ответ дан 28 November 2019 в 00:16
поделиться

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

См. В Док Apple о том, что представляет собой рамки .

4
ответ дан 28 November 2019 в 00:16
поделиться

Сценарий, который вы описываете, может быть решен репликацией базы данных. Например, если вы используете MS SQL Server в качестве основного C / S DB DB, его можно реплицировать в локальную установку MSSQL Express на рабочей станции или ноутбуке Offline. Пока ваши пользователи вне офиса, приложение должно подключаться к локальной БД, а при возврате изменения реплицированы обратно в центральную БД. Я думаю, что это «стандартный» подход, который вы ищете, где вам не нужно писать специальный код для своего оффлайн-ситуации (за исключением кода, который меняет соединение, а какой-то код для начала репликации).

Для вас может быть интерес, что система CRM, используемая нашей компанией, работает так, как эта, локальная используемая БД - это «MSSQL Desktop Engine», предшественник Express Edition, но ИМХО это должно работать с Express Edition , тоже. Насколько я знаю, вам не нужно платить любые лицензионные сборы за экземпляры MSSQL Express.

-121--4043535-

Согласно стандарту C99 , длинный длинный - это целочисленный тип, который составляет не менее 64 бит. Указана два значения целых 64-битных типов: давно длинный int и unsigned Long int

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

Также есть длинный двойной тип , указанный C99. Это расширенная точная точная точка с плавающей точкой числового типа длина длина для 80 битов на самых популярных платформах и реализациях C86 на основе X86.

-121--1457401-

Самое быстрое решение состоит в том, чтобы добавить только ссылки файлов .h и .m к одному из проектов. Просто снимите флажок «Копировать» -Checkbox в «Добавить существующие файлы» -Dialog в Xcode. Имейте в виду, что вы также можете скопировать ссылочные файлы, если вы перемещаете / делитесь своим проектом.

2
ответ дан 28 November 2019 в 00:16
поделиться

Я нашел здесь интересную статью по этой теме: http://www.clintharris.net/2009/iphone-app-shared-libraries/ Это ответ на мой вопрос, который конкретно касается нескольких приложений для iPhone. код обмена. В нем не упоминаются фреймворки (см. Выше), поэтому я не могу сказать, выгодно ли их предложение (ссылки на проекты xcode) с решением фреймворков.

1
ответ дан 28 November 2019 в 00:16
поделиться

Очень хороший способ сделать это - поместить общий код в систему SCM и включить его в каждый проект, в котором он нужен. Таким образом, каждый проект может совместно использовать код, вы можете его редактировать в любом месте и просто проверьте изменения обратно в систему управления версиями, когда вам это понравится - и тогда все другие проекты выиграют от вашей работы.

Это имеет большие преимущества по сравнению с другими способами. ИМО:

vs. frameworks : упаковка кода в фреймворк довольно раздражает, а фреймворки с частным пакетом загружаются неоправданно долго - особенно просто для того, чтобы добавить несколько классов в ваше приложение. Уил Шипли из Omni Group (в то время) однажды обнаружил, что фреймворки, которые компания включила во все свои приложения, добавляли несколько секунд ко времени запуска каждого приложения. Упаковка частных классов в фреймворк также может способствовать большему связыванию, чем это строго необходимо - действительно заманчиво просто создать One True Framework, в котором находятся все ваши общие классы, поэтому вы начинаете предполагать, что этот код всегда будет жить вместе. и он становится неразделимым. По сути, каркасы - это молоток, а проблема - винт.

vs. просто включение файлов : Надеюсь, вы в какой-то момент все равно поместите свое приложение в SCM, и простое включение файлов на место создает проблему, потому что они будут отсутствовать в SCM. Копирование файлов в каждый проект создает противоположную проблему - каждый проект будет включать свою собственную версию файлов, и вам придется вручную распространять любые полезные изменения.

12
ответ дан 28 November 2019 в 00:16
поделиться