我见过许多开发人员将各种方便的宏添加到他们的 iOS 项目的 Prefix.pch 中。

您建议在 iOS Prefix.pch 文件中添加(或不添加)什么内容?你的 Prefix.pch 是什么样的?

有帮助吗?

解决方案

EWWW ......不要把宏在.PCH文件!一个.PCH文件,顾名思义,一个项目的具体编译头。这真的不应该使用超出了项目的背景下,它真的不应该包含什么,但#includes和#imports。

如果你有一些宏等,你想报头之间的共享,然后在自己的头文件把脚伸 - Common.h或者别的什么 - 并且#include的在的开始。 PCH。

其他提示

对于现代 iOS 和 OS X,人们应该使用 模块. 。默认情况下,新项目启用此功能,并且使用以下命令完成导入/包含 @import.

模块允许编译器创建模块内容的中间表示(例如框架的标题)。与 PCH 非常相似,这种中间表示可以在多个翻译之间共享。但是模块更进一步,因为模块不一定是特定于目标的,并且它们的声明不需要本地化(到 *.pch)。这种表示可以为您节省大量冗余的编译器工作。

使用模块,您不需要 PCH,并且您可能应该完全废除它们——转而使用 @import 本地依赖。在这种情况下,PCH 只会让您免遭 打字 包含本地依赖项(在我看来,你无论如何都应该这样做)。

现在,如果我们回顾最初的问题:你应该避免在你的 PCH 中填充各种随机的东西;宏、常量、 #defines, ,以及各种小图书馆。一般来说,你应该 省略对大多数源文件来说真正不必要的内容. 。将各种东西放入 PCH 只会增加一堆重量和依赖性。我看到人们将他们链接的所有内容以及更多内容都放在 PCH 中。实际上,在大多数情况下,辅助框架通常只需要对少数翻译可见。例如。“这是我们的 StoreKit 内容 - 让我们仅在需要的地方导入 StoreKit 必须 可见。具体来说,这3个翻译”。这可以缩短构建时间,并帮助您跟踪依赖项,以便您可以更轻松地重用代码。因此,在 ObjC 项目中,您通常会停在 Foundation 上。如果有很多 UI,那么您可能会考虑将 UIKit 或 AppKit 添加到您的 PCH。这一切都假设您想要优化构建时间。包含(几乎)所有内容的大型 PCH 的问题之一是删除不必要的依赖项非常耗时。一旦项目的依赖项增加并且构建时间增加,您需要通过消除不必要的依赖项来进行反击,以减少构建时间。此外,任何经常更改的内容通常都应该保留在您的 PCH 之外。更改需要完全重建。有一些共享 PCH 的选项。如果您使用 PCH,请务必支持共享。

就我在 PCH 中放入的内容而言:几年前我就不再将它们用于绝大多数目标。通常没有足够的共同点来获得资格。请记住,我编写的是 C++、ObjC、ObjC++ 和 C - 编译器会为目标中的每个 lang 生成一个。因此启用它们通常会导致编译时间变慢和 I/O 更高。最终,增加依赖性并不是对抗复杂项目中的依赖性的好方法。使用多种语言/方言时,给定目标所需的依赖关系存在很大差异。不,我不建议将其作为每个项目的最佳选择,但这确实为大型项目中的依赖管理提供了一些视角。


参考


笔记

  • 这个问题最初是在模块引入之前几年提出的。
  • 目前(Xcode 5.0),模块适用于 C 和 ObjC,但不适用于 C++。

我同意bbum。我在PCH文件的看法是,它应该包含几乎只有#include#import语句。所以,如果你有一堆有用的,高层次的宏定义他们像Common.h#import该文件,如bbum建议。

我通常走的更远了一步,并使用PCH文件#import一个名为XXCategories.h(其中XX是使用class命名前缀约定),其中包含#imports我的所有的UIKit和基金类属:NSString+XXAdditions.hUIColor+XXAdditons.h等。

创建一个头文件 “macros.h”

导入此报头插入到Prefix.pch

在本macros.h把所有的框架和其他重要的事情。

如果你担心性能,不要着急,看怎么说苹果:

页眉和效果

  

如果您担心,包括一个主头文件可能会导致您的   程序膨胀,不用担心。由于OS X接口实现   使用框架,对于这些接口的代码驻留在动态   共享库,而不是在你的可执行文件。此外,只有代码   使用你的程序是以往任何时候都加载到内存在运行时,让你   在内存占用同样保持较小。         至于包括在编译过程中有大量的头文件,再次,不要担心。 Xcode提供了一个预编译   头设施加快编译时间。通过编译所有的   在一次框架头,没有必要重新编译头   除非你添加一个新的框架。在此期间,你可以使用任何   从很少或根本没有表现包括框架接口   罚。

也是我macros.h我投入了大量的常量,如:

// 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