Вопрос

Я видел многие разработчики, которые добавляют различные удобные макросы на префикс.pch их проектов IOS.

Что делать (или нет), вы рекомендуете добавить в файл iOS Prefix.pch? Как выглядит ваш префикс.пч?

Это было полезно?

Решение

Ewww ... Не кладите макросы в файл .pch! Файл .pch по определению, специфичный проект прекомпалированный заголовок. Это действительно не должно использоваться вне контекста проекта, и это действительно не должно ничего не должно содержать, кроме #includeпесок #importс.

Если у вас есть несколько макросов, а так, чтобы вы хотели поделиться между заголовками, то придерживайтесь их собственного файла заголовка - Common.h или что-то - и #include это в начале .pch.

Другие советы

Для современного IOS и OS X люди должны использовать Модули. Отказ Это включено по умолчанию для новых проектов, а импорт / включение осуществляется с использованием @import.

Модули позволяют компилятору создать промежуточное представление содержимого модуля (например, заголовки рамки). Так же, как PCH, это промежуточное представление может быть передано в несколько переводов. Но модули принимают этот шаг дальше, потому что модуль не обязательно является целевым конкретным, и их декларации не должны быть локализованными (к *.pch). Это представление может сэкономить вам работу избыточного компилятора тонна.

Используя модули, вам не нужен PCC, и вы, вероятно, должны просто покончить с ними полностью - в пользу использования @import местный к зависимости. В этом случае PCH только спасает вас от печатать включения местные для зависимостей (которые IMO вы должны делать в любом случае).

Теперь, если мы обратно обратно на оригинальный вопрос: вы должны избегать заполнения вашего PCC со всеми видами случайных вещей; Макросы, константы, #defines, и всевозможные маленькие библиотеки. Как правило, вы должны Опустите то, что действительно не нужна для большинства ваших исходных файлов. Отказ Помещая всевозможные вещи в ваш PCC, просто добавляют кучу веса и зависимости. Я вижу, что люди кладут все, что они ссылаются и больше в PCH. На самом деле, вспомогательные рамки, как правило, нужно только быть видны несколькими переводами в большинстве случаев. Например, «вот наш магазин - давайте импортируем starekit только где это должен быть видимым. В частности, эти 3 перевода ". Это сохраняет вашу строение раз и помогает отслеживать ваши зависимости, чтобы вы могли легче повторно использовать код. Так что в проекте OBJC вы обычно останавливались на основании. Если есть много UI, тогда вы можете рассмотреть возможность добавления UIKIT или APPKIT на ваш PCH. Это все предполагает, что вы хотите оптимизировать время сборки. Одна из проблем с большими чашками, которые включают (почти) все, что снятие ненужных зависимостей - это очень много времени. Зависимости вашего проекта растут, и ваше время сборки поднимается, вам нужно отстрелить, устраняя ненужные зависимости, чтобы уменьшить ваше время сборки. Кроме того, все, что часто часто следует, как правило, должно быть вытеснено из вашего PCH. Изменение требует полной перестройки. Есть несколько вариантов поделиться PCHS. Если вы используете PCHS, стремитесь поддерживать совместное использование.

Что касается того, что я положил в мой PCH: я перестал использовать их для подавляющего большинства целей лет назад. Там просто обычно недостаточно для квалификации. Имейте в виду, я пишу C ++, OBJC, OBJC ++ и C - компилятор излучает один для каждого Lang в вашей цели. Так что включение их часто привело к более медленным временам компиляции и выше ввода / вывода. В конечном итоге, увеличение зависимости не является хорошим способом борьбы с зависимостью в сложных проектах. Работа с несколькими языками / диалектами, существует много изменений в зависимостях, необходимых для данной цели. Нет, я бы не советую, чтобы как оптимально для каждого проекта, но это дает некоторую перспективу для управления зависимостями в более крупных проектах.


использованная литература


Примечания

  • Этот вопрос первоначально спросил несколько лет до появления модулей.
  • В настоящее время (Xcode 5.0) модули работают для C и OBJC, но не C ++.

Я согласен с bbum. Мой взять на файл PCH в том, что он должен содержать только в значительной степени #include или #import заявления. Так что, если у вас есть куча полезных макросов высокого уровня, определить их в чем-то вроде Common.h а также #import Этот файл, как рекомендуется BBUM.

Я обычно выхожу на шаг дальше и использую файл PCH для #import файл называется XXCategories.h (куда XX Используется ли класс именования префиксной конвенции), которая содержит #importS Для всех моих категорий класса Uikit и Foundation: NSString+XXAdditions.h, UIColor+XXAdditons.h, так далее.

Создайте заголовочный файл "macros.h"

Импортируйте этот заголовок в Prefix.pch

В этих макросах поместите все рамки и другие важные вещи.

Если вы беспокоитесь о производительности, не волнуйтесь, посмотрите, что говорит Apple:

Заголовки и производительность

Если вы беспокоитесь, что в том числе файл главного заголовка может привести к раздуванию вашей программы, не волнуйтесь. Поскольку интерфейсы OS X реализуются с помощью Frameworks, код для этих интерфейсов проживает в динамической общей библиотеке, а не в исполняемости. Кроме того, только код, используемый вашим программой, когда-либо загружен в память во время выполнения, поэтому ваш запас в память одинаково остается небольшим. Что касается большого количества файлов заголовка во время компиляции, еще раз, не волнуйтесь. XCode предоставляет предварительнокомпроцентный заголовок для ускорения времен компиляции. Компилируя все заголовки рамок одновременно, нет необходимости перекомпилировать заголовки, если вы не добавите новую структуру. Тем временем вы можете использовать любой интерфейс из включенных каркасов с небольшим или без производительности.

Также в моих макросах я положил много постоянных, таких как:

// delegate
#define UIAppDelegate (AppDelegate *)[[UIApplication sharedApplication] delegate]
#define APPDELEGATE   ((AppDelegate *)[[UIApplication sharedApplication] delegate])

// system
#define IS_IPHONE_4INCH (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone && [UIScreen mainScreen].bounds.size.height==568)
#define IS_IPAD                     (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)

// screen size
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0)
#define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0)
#define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f)
#define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0)
#define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0)
#define IS_RETINA_DISPLAY ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0))
#define IS_PORTRAIT                 UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation])
#define IS_LANDSCAPE                UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])

//system version
#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

// math
#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

// cores
#define RGB(r,g,b)    [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
#define RGBA(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a]
#define MAKECOLOR(R, G, B, A) [UIColor colorWithRed:((float)R/255.0f) green:((float)G/255.0f) blue:((float)B/255.0f) alpha:A]
#define MAKECOLORFROMHEX(hexValue) [UIColor colorWithRed: ((float)((hexValue & 0xFF0000) >> 16))/255.0 green:((float)((hexValue & 0xFF00) >> 8))/255.0 blue:((float)(hexValue & 0xFF))/255.0 alpha:1.0]



//customizations
#define SHOW_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
#define HIDE_STATUS_BAR               [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

#define SHOW_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:FALSE];
#define HIDE_NAVIGATION_BAR           [self.navigationController setNavigationBarHidden:TRUE];

#define VC_OBJ(x) [[x alloc] init]
#define VC_OBJ_WITH_NIB(x) [[x alloc] initWithNibName : (NSString *)CFSTR(#x) bundle : nil]

#define RESIGN_KEYBOARD [[[UIApplication sharedApplication] keyWindow] endEditing:YES];

#define CLEAR_NOTIFICATION_BADGE                       [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
#define REGISTER_APPLICATION_FOR_NOTIFICATION_SERVICE  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]

#define HIDE_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
#define SHOW_NETWORK_ACTIVITY_INDICATOR                 [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top