Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Prefix.pch最佳实践_Ios_Objective C_Xcode_Pch - Fatal编程技术网

iOS Prefix.pch最佳实践

iOS Prefix.pch最佳实践,ios,objective-c,xcode,pch,Ios,Objective C,Xcode,Pch,我见过许多开发人员将各种方便的宏添加到iOS项目的Prefix.pch中 您建议(或不建议)在iOS Prefix.pch文件中添加什么内容?你的Prefix.pch是什么样子的?EWW…不要将宏放在.pch文件中!根据定义,.pch文件是特定于项目的预编译头文件。它真的不应该超出项目的上下文使用,它真的不应该包含任何内容,除了\includes和\imports 如果您有一些宏,并且希望在头文件之间共享,那么请将它们粘贴到它们自己的头文件中-Common.h或其他什么-#包括在.pch开头的。

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


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

EWW…不要将宏放在.pch文件中!根据定义,.pch文件是特定于项目的预编译头文件。它真的不应该超出项目的上下文使用,它真的不应该包含任何内容,除了
\include
s和
\import
s


如果您有一些宏,并且希望在头文件之间共享,那么请将它们粘贴到它们自己的头文件中-
Common.h
或其他什么-
#包括在.pch开头的

我同意bbum。我对PCH文件的看法是,它应该只包含
#include
#import
语句。因此,如果您有一堆有用的高级宏,请按照bbum的建议,在类似于
Common.h
#import
的文件中定义它们


我通常会进一步使用pCH文件到<>代码>导入/<代码>一个名为“代码> xxx类别/h代码/代码>的文件(其中<代码> xx代码>代码>是您使用的类命名前缀约定),它包含了所有我的UIKIT和基础类类别的代码>等等。

对于现代iOS和OSX,人们应该使用模块。默认情况下,这对于新项目是启用的,导入/包含是使用
@import
完成的

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

使用模块时,您不需要PCH,而且您可能应该完全取消它们——使用依赖项的本地
@import
。在这种情况下,PCH只是将您从键入包含本地到依赖项(在我看来,您无论如何都应该这样做)中解放出来

现在,如果我们回顾一下最初的问题:你应该避免用各种随机的东西填满你的PCH;宏、常量、定义和各种小库。通常,您应该忽略大多数源文件实际上不需要的内容。把各种各样的东西放进你的PCH只是增加了一堆重量和依赖性。我看到人们把他们链接到的所有东西都放在PCH中。实际上,在大多数情况下,辅助框架通常只需要对少数翻译可见。例如,“这是我们的StoreKit资料-让我们只在它必须可见的地方导入StoreKit。具体来说,这三种翻译”。这可以缩短构建时间,并帮助您跟踪依赖关系,以便更容易地重用代码。所以在Objc项目中,你通常会在基金会停留。如果有很多UI,那么你可以考虑在你的PCH中添加UIKIT或AppKIT。这都是假设您想要优化构建时间。包含(几乎)所有内容的大型PCH的一个问题是,删除不必要的依赖关系非常耗时。一旦项目的依赖项增加,构建时间增加,您就需要通过消除不必要的依赖项进行反击,以减少构建时间。此外,任何经常发生变化的事情通常都应该被排除在PCH之外。更改需要完全重建。有一些选择可以分享PCH。如果您使用PCHs,请务必支持共享

至于我在PCH中的内容:多年前,我在绝大多数目标中都停止使用它们。通常没有足够的共同点来限定。请记住,我编写C++、Objc、Objc++和C编译器为目标中的每个LAN发出一个。因此,启用它们通常会导致编译时间变慢和I/O增加。最终,增加依赖性并不是在复杂项目中消除依赖性的好方法。使用多种语言/方言时,给定目标所需的依赖关系存在很大差异。不,我不认为这对每个项目都是最佳的,但这确实为大型项目中的依赖关系管理提供了一些视角


参考资料


注释

  • 这个问题最初是在模块引入前几年提出的
  • (XCODER 5),模块工作于C和Objc,而不是C++。
创建头文件“macros.h”

将此标题导入Prefix.pch

在这个宏中,h放置了所有的框架和其他重要的东西

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

标题和性能

如果您担心包含主头文件可能会导致 程序膨胀了,别担心。因为OSX接口是实现的 使用框架,这些接口的代码驻留在动态 共享库,而不是在可执行文件中。此外,只有代码 您的程序所使用的数据在运行时加载到内存中,因此 内存占用空间同样很小。 至于在编译过程中包含大量头文件,再一次,不要担心。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];

你会在这个共同点中包括什么