91

iOS プロジェクトの Prefix.pch にさまざまな便利なマクロを追加する多くの開発者を見てきました。

iOS Prefix.pch ファイルに追加することを推奨する (または推奨しない) ものは何ですか? Prefix.pch はどのように見えますか?

4

4 に答える 4

122

Ewww… マクロを .pch ファイルに入れないでください! .pch ファイルは、定義上、プロジェクト固有のプリコンパイル済みヘッダーです。#includeプロジェクトのコンテキストを超えて使用するべきではなく、 s とs以外は何も含めるべきではありません#import

ヘッダー間で共有したいマクロなどがある場合は、それらを独自のヘッダー ファイル (Common.hまたは何でも) に貼り#include 付け、.pch の先頭に配置します。

于 2010-05-17T03:02:38.063 に答える
8

私はバムに同意します。#includePCH ファイルに対する私の見解は、ほとんどor#importステートメントのみを含める必要があるということです。したがって、役立つ高レベルのマクロがたくさんある場合は、bbum が提案したようCommon.hに、そのファイルのようなものでそれらを定義してください。#import

私は通常、さらに一歩進んで、すべての UIKit および Foundation クラス カテゴリの s を含む(は使用するクラス命名プレフィックス規則) という名前#importのファイルに PCH ファイルを使用します: 、など。XXCategories.hXX#importNSString+XXAdditions.hUIColor+XXAdditons.h

于 2010-12-10T23:55:36.940 に答える
6

ヘッダー ファイル「macros.h」を作成します。

このヘッダーを Prefix.pch にインポートします

この macros.h には、すべてのフレームワークとその他の重要なものが含まれています。

パフォーマンスが心配な場合でも、心配する必要はありません。Apple のコメントをご覧ください。

ヘッダーとパフォーマンス

マスター ヘッダー ファイルをインクルードするとプログラムが肥大化するのではないかと心配している場合でも、心配する必要はありません。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];
于 2015-01-01T00:00:27.040 に答える