ios開發 -Prefix.pch文件的用法詳解

咱們知道,每新創建一個工程,好比說HelloWord,在分類SupportingFiles裏都會有一個以工程名開頭-Prefix.pch結尾的文件,如HelloWord-Prefix.pch。對於這個文件,很長一段時間裏筆者都沒以爲它礙事。直到有一天筆者學習NSLog看網上的教程,你們是怎樣在最終提交應用的時候,一次性將NSLog語句移除。
網上大多轉來轉去的方法,都是說把以下的語句php

#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」的意思,那麼字面意思理解就是預編譯文件頭嘍。聽說在程序編譯前都優先編譯好這裏指定的文件,這樣能夠加快編譯速度。好吧,咱們來看看默認這個文件裏包含什麼:
app

//
// 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,你發現了什麼?你發現了什麼?ide

//
//  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>?筆者在使用以下語句的時候:post

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神馬的,用起來順手多了,不再用每次使用的時候先引用一下了。
注意到上面的spa

  #import "TKAlertCenter.h"
  #define TKDCenter [TKAlertCenter defaultCenter]

沒?我以爲每次都寫:調試

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

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

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

是否是短多了?
一樣了,個人每一個工程的-Prefix.pch文件裏還定義了以下的變量:orm

#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升級被拒的事兒吧?當時由於我已經用上了這個變量,直接在這個一改,嘿嘿,幾十個文件立馬跟着變了,省力更省心!blog

最後發張圖,證實個人存在:

相關文章
相關標籤/搜索