天天看點

ios開發 <AppName>-Prefix.pch檔案的用法詳解

我們知道,每建立立一個工程,比如說HelloWord,在分類SupportingFiles裡都會有一個以工程名開頭-Prefix.pch結尾的檔案,如HelloWord-Prefix.pch。對于這個檔案,很長一段時間裡筆者都沒覺得它礙事。直到有一天筆者學習NSLog看網上的教程,大家是怎樣在最終送出應用的時候,一次性将NSLog語句移除。

網上大多轉來轉去的方法,都是說把如下的語句

#ifdef DEBUG

#    define DLog(...) NSLog(__VA_ARGS__)

#else

#    define DLog(...)

#endif

#define ALog(...) NSLog(__VA_ARGS__)

加到 <AppName>-Prefix.pch的檔案中。雖然對于這種作法,筆者最終由于,不想在調試一個東西而出現一堆東西,最終沒有使用這種方法。但是 <AppName>-Prefix.pch這個檔案,最終引起了作者的注意。

網上查了一下有解釋說.pch是“precompiled header”的意思,那麼字面意思了解就是預編譯檔案頭喽。據說在程式編譯前都優先編譯好這裡指定的檔案,這樣可以加快編譯速度。好吧,我們來看看預設這個檔案裡包含什麼:

//

// Prefix header for all source files of the 'HelloWorld' target in the 'HelloWorld' project

//

#import <Availability.h>

#ifndef __IPHONE_4_0

#warning "This project uses features only available in iOS SDK 4.0 and later."

#endif

#ifdef __OBJC__

  #import <UIKit/UIKit.h>

  #import <Foundation/Foundation.h>

#endif

按着Command鍵,再點開UIKit/UIKit.h,你發現了什麼?你發現了什麼?

//

//  UIKit.h

//  UIKit

//

//  Copyright (c) 2005-2011, Apple Inc. All rights reserved.

//

#import <UIKit/UIKitDefines.h>

#import <UIKit/UIAccelerometer.h>

#import <UIKit/UIAccessibility.h> 

#import <UIKit/UIActivityIndicatorView.h>

#import <UIKit/UIAlert.h>

#import <UIKit/UIApplication.h>

#import <UIKit/UIBarButtonItem.h>

#import <UIKit/UIBarItem.h>

#import <UIKit/UIBezierPath.h>

#import <UIKit/UIButton.h>

#import <UIKit/UIColor.h>

#import <UIKit/UIControl.h>

#import <UIKit/UIDataDetectors.h>

#import <UIKit/UIDatePicker.h>

#import <UIKit/UIDevice.h>

#import <UIKit/UIDocument.h>

#import <UIKit/UIDocumentInteractionController.h>

#import <UIKit/UIEvent.h>

#import <UIKit/UIFont.h>

#import <UIKit/UIGeometry.h>

#import <UIKit/UIGestureRecognizer.h>

#import <UIKit/UIGraphics.h>

#import <UIKit/UIImage.h>

#import <UIKit/UIImagePickerController.h>

#import <UIKit/UIImageView.h>

#import <UIKit/UIInterface.h>

#import <UIKit/UILabel.h>

#import <UIKit/UILocalNotification.h>

#import <UIKit/UILocalizedIndexedCollation.h>

#import <UIKit/UILongPressGestureRecognizer.h>

#import <UIKit/UIManagedDocument.h>

#import <UIKit/UIMenuController.h>

#import <UIKit/UINavigationBar.h>

#import <UIKit/UINavigationController.h>

#import <UIKit/UINib.h>

#import <UIKit/UINibDeclarations.h>

#import <UIKit/UINibLoading.h>

#import <UIKit/UIPageControl.h>

#import <UIKit/UIPageViewController.h>

#import <UIKit/UIPanGestureRecognizer.h>

#import <UIKit/UIPasteboard.h>

#import <UIKit/UIPickerView.h>

#import <UIKit/UIPinchGestureRecognizer.h>

#import <UIKit/UIPopoverController.h>

#import <UIKit/UIPopoverBackgroundView.h>

#import <UIKit/UIPrintError.h>

#import <UIKit/UIPrintFormatter.h>

#import <UIKit/UIPrintInfo.h>

#import <UIKit/UIPrintInteractionController.h>

#import <UIKit/UIPrintPageRenderer.h>

#import <UIKit/UIPrintPaper.h>

#import <UIKit/UIProgressView.h>

#import <UIKit/UIReferenceLibraryViewController.h>

#import <UIKit/UIResponder.h>

#import <UIKit/UIRotationGestureRecognizer.h>

#import <UIKit/UIScreen.h>

#import <UIKit/UIScreenMode.h>

#import <UIKit/UIScrollView.h>

#import <UIKit/UISearchBar.h>

#import <UIKit/UISearchDisplayController.h>

#import <UIKit/UISegmentedControl.h>

#import <UIKit/UISlider.h>

#import <UIKit/UISplitViewController.h>

#import <UIKit/UIStepper.h>

#import <UIKit/UIStoryboard.h>

#import <UIKit/UIStoryboardPopoverSegue.h>

#import <UIKit/UIStoryboardSegue.h>

#import <UIKit/UIStringDrawing.h>

#import <UIKit/UISwipeGestureRecognizer.h>

#import <UIKit/UISwitch.h>

#import <UIKit/UITabBar.h>

#import <UIKit/UITabBarController.h>

#import <UIKit/UITabBarItem.h>

#import <UIKit/UITableView.h>

#import <UIKit/UITableViewCell.h>

#import <UIKit/UITableViewController.h>

#import <UIKit/UITapGestureRecognizer.h>

#import <UIKit/UITextField.h>

#import <UIKit/UITextInput.h>

#import <UIKit/UITextInputTraits.h>

#import <UIKit/UITextView.h>

#import <UIKit/UIToolbar.h>

#import <UIKit/UITouch.h>

#import <UIKit/UIVideoEditorController.h>

#import <UIKit/UIView.h>

#import <UIKit/UIViewController.h>

#import <UIKit/UIWebView.h>

#import <UIKit/UIWindow.h>

舉個例子,有沒有注意到#import <UIKit/UILabel.h>?筆者在使用如下語句的時候:

UILabel *_testLabel = [UILabel alloc] initWithFrame:CGRectMake(0, 0, 20, 15)];

曾經不止一次的懷疑,這個UILabel是哪來的,為嘛可以直接用。這個檔案就說明了一切!

對此你有什麼想法?我的想法就是:如果我每個View幾乎都要用到ASIHTTPRequest的話,那麼我隻在這裡引用一次ASIHTTPRequest.h就夠了!

這樣我就可以在需要使用的ASIHTTPRequest的時候直接用了!

于是我工程裡的這個檔案變成了這樣:

//

// Prefix header for all source files of the 'HelloWorld' target in the 'HelloWorld' project

//

#import <Availability.h>

#ifndef __IPHONE_3_0

#warning "This project uses features only available in iPhone SDK 3.0 and later."

#endif

#ifdef __OBJC__

  #import <UIKit/UIKit.h>

  #import <Foundation/Foundation.h>

  #import "nstimer.h"

  #import "ButtWithBlockActions.h"

  #import "TKAlertCenter.h"

  #define TKDCenter [TKAlertCenter defaultCenter] 

  #import "DataManager.h"

  #define DDManager [DataManager defaultManager]

  #define DataMemDic [DDManager memDic]

  //for checkUpdateVersion

  #import "Reachability.h"

  #import "ASIHTTPRequest.h"

  #import "ASIFormDataRequest.h"

  #import "JSON.h"

  //BlockAlert

  #import "RIButtonItem.h"

  #import "UIAlertView+Blocks.h"

  #import "UIActionSheet+Blocks.h"

  #import <QuartzCore/QuartzCore.h>

  #import "function.h"

  #import "MediaPlayer/MediaPlayer.h"

#endif

這樣的話,我覺得的TKAlertCenter神馬的,用起來順手多了,再也不用每次使用的時候先引用一下了。

注意到上面的

  #import "TKAlertCenter.h"

  #define TKDCenter [TKAlertCenter defaultCenter]

沒?我覺得每次都寫:

[[TKAlertCenter defaultCenter] postAlertWithMessage:@"http://blog.cnrainbird.com"];

這樣的句子太長了!有了上面的定義,我現在變成這樣寫了:

  [TKDCenter postAlertWithMessage:@"http://blog.cnrainbird.com"];

是不是短多了?

同樣了,我的每個工程的-Prefix.pch檔案裡還定義了如下的變量:

#define NDSUD [NSUserDefaults standardUserDefaults]

#define NNCDC [NSNotificationCenter defaultCenter]

#define FM [NSFileManager defaultManager]

#define APPSHAREAPP [UIApplication sharedApplication]

#define appOrientation [[UIApplication sharedApplication] statusBarOrientation]

#define DocumentPath [NSString stringWithFormat:@"%@/Library/Caches",NSHomeDirectory()]

#define IOSSystemVersion [[[UIDevice currentDevice] systemVersion] floatValue]

這樣做有兩個好處:

1.變量名變短了。

雖然object-c裡強調變量要完整的表達意思,但是類似[NSUserDefaults standardUserDefaults]這樣的單例實在太長了,參數名再長點兒一行都寫不下了,很不易于閱讀。

2.友善修改

看到DocumentPath這個變量沒?大家夥還都記得的IOS5剛出來那會兒,N多app因為把存放檔案的路徑擱到了Documents下App更新被拒的事兒吧?當時因為我已經用上了這個變量,直接在這個一改,嘿嘿,幾十個檔案立馬跟着變了,省力更省心!

ios開發 &lt;AppName&gt;-Prefix.pch檔案的用法詳解

注:轉載請注明: 轉自Rainbird的個人部落格

轉載于:https://www.cnblogs.com/tangaofeng/p/4972969.html