iOS之Prefix.pch

本文轉載至 http://blog.csdn.net/lvxiangan/article/details/21325093
 

Prefix.pch的做用和用法

Hello World_Prefix.pch:擴展名.pch表示"precompiled header",這是一個你工程要用到的來自於外部框架的頭文件列表。位於工程--targets--build settings--AppleLLVM 5.0 Language中的Prefix Header選項html

xcode將編譯這些頭到文件,這將減小你在選擇Build 或Build and Go時編譯項目的時間。一般用到的頭文件已經自動包含了pch,系統編譯每一個cpp文件前,都會先include這個文件。這樣就節省了添加include的時間,至關於加速編譯.還有就是能夠再這裏面放入宏,在整個工程中均可以用。節省了時間小程序

 

當咱們新建一個工程的時候,在Supporting FIles文件下會看到一個以  -Prefix.pch結尾文件的文件,pch全稱是「precompiled header」,也就是預編譯頭文件,該文件裏存放的工程中一些不常被修改的代碼,好比經常使用的框架頭文件,這樣作的目的提升編譯器編譯速度。當咱們修改一個工程中某個文件代碼時候,編譯器並非從新編譯全部全部文件,而是編譯改動過文件。假如pch中某個文件修改了,那麼pch整個文件裏包含的的其餘文件也會從新編譯一次,這樣就會消耗大量時間,因此它裏面添加的文件最好是是不多變更或不變更的頭文件或者是預編譯的代碼片斷;api

在新建一個工程時,pch後綴文件裏代碼是數組

#ifdef __OBJC__xcode

    #import <Foundation/Foundation.h>框架

    #import <UIKit/UIKit.h>ide

#endif函數

 

 

或許你會以爲這預編譯代碼不多,可是你能夠查看一下UIKit.h的定義文件中post

//ui

//  UIKit.h

//  UIKit

//

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

//

 

#import <UIKit/UIKitDefines.h>

#import <UIKit/UIAccelerometer.h>

#import <UIKit/UIAccessibility.h> 

#import <UIKit/UIActivityIndicatorView.h>

#import <UIKit/UIActivity.h>

#import <UIKit/UIActivityItemProvider.h>

#import <UIKit/UIActivityViewController.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/UICollectionView.h>

#import <UIKit/UICollectionViewCell.h>

#import <UIKit/UICollectionViewController.h>

#import <UIKit/UICollectionViewFlowLayout.h>

#import <UIKit/UICollectionViewLayout.h>

#import <UIKit/UICollectionViewTransitionLayout.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/UIFontDescriptor.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/UIInputView.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/UIMotionEffect.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/UIRefreshControl.h>

#import <UIKit/UIResponder.h>

#import <UIKit/UIRotationGestureRecognizer.h>

#import <UIKit/UIScreen.h>

#import <UIKit/UIScreenEdgePanGestureRecognizer.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/UITableViewHeaderFooterView.h>

#import <UIKit/UITableViewCell.h>

#import <UIKit/UITableViewController.h>

#import <UIKit/UITapGestureRecognizer.h>

#import <UIKit/UITextChecker.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/NSAttributedString.h>

#import <UIKit/NSLayoutConstraint.h>

#import <UIKit/NSLayoutManager.h>

#import <UIKit/NSParagraphStyle.h>

#import <UIKit/NSShadow.h>

#import <UIKit/NSStringDrawing.h>

#import <UIKit/NSText.h>

#import <UIKit/NSTextAttachment.h>

#import <UIKit/NSTextContainer.h>

#import <UIKit/NSTextStorage.h>

#import <UIKit/UIStateRestoration.h>

#import <UIKit/UIViewControllerTransitioning.h>

#import <UIKit/UIViewControllerTransitionCoordinator.h>

#import <UIKit/UIDynamicAnimator.h>

#import <UIKit/UIDynamicBehavior.h>

#import <UIKit/UIPushBehavior.h>

#import <UIKit/UISnapBehavior.h>

#import <UIKit/UIDynamicItemBehavior.h>

#import <UIKit/UIGravityBehavior.h>

#import <UIKit/UIAttachmentBehavior.h>

#import <UIKit/UICollisionBehavior.h>


這些很多了吧,工程每次運行都編譯是否是很費時間,這些是蘋果公司內部定義的標準頭文件,咱們不能也沒有權限修改這些頭文件定義內容,因此,當放到pch文件中會加速編譯過程;

咱們看到有這樣些文件也被添加到裏面,可能會想難道這些頭文件變化不大嗎?

//添加的預編譯 

#import "ASIHTTPRequest.h" 
#import "ASIFormDataRequest.h" 
#import "ASIHTTPRequestDelegate.h" 
#import "ASIHTTPRequestConfig.h" 
#import "TBXML.h" #import "TBXML+HTTP.h" 
#import "TBXML+Compression.h" #import "Config.h" 
#import "EGORefreshTableHeaderView.h" 
#import "DataSingleton.h" 
#import "ImgRecord.h" #import "IconDownloader.h" 
#import "MBProgressHUD.h" 
#import "GCDiscreetNotificationView.h" 
#import "NdUncaughtExceptionHandler.h" 
#import "JSNotifier.h" #import "AFOSCClient.h" 
#import "AFHTTPRequestOperation.h" 
#import "AFXMLRequestOperation.h"

其實,這些文件特殊之處在於他們都是第三方類庫的頭文件,第三方類庫將一些對象進行高度封裝,留下接口,而後咱們根據類庫接口直接調用就能夠,這些第三方類庫通常都比iOS原生自帶的更加簡單易用,好比TBXML解析庫,比iOS自帶的NSXMLPaser解析器速度功能上都會好一些;

還有一些宏定義都是比較經常使用方式的宏定義,好比定義的api接口,這些接口變得固然不多了;

而後就剩下最後面的

#ifdef DEBUG 
#define debugLog(...) NSLog(__VA_ARGS__) 
#define debugMethod() NSLog(@"%s", __func__) 
#else #define debugLog(...) 
#define debugMethod() 
#endif

工程有Debug Version和Release Version,Debug Version是程序開發過程當中版本,它包含了全部調試信息,一些經常使用的NSLog打印日誌,在程序調試過程工根據咱們設置的調試信息能夠看出什麼地方出錯,咱們在運行運行一個小程序的時候,會不會首先就想到進行斷點調試呢,應該是首先想着NSLog一下,看看哪一個函數方法沒執行,看看是否是哪一個數組的值沒取出來。Release Version是發佈版本,不打印NSLog能夠加快程序運行速度,減小內存使用。   可是到一個大工程中,會有不少不少這樣的NSLog,在咱們工程完美運行的時候,發佈Release 版本的時候,難道咱們去一行行的註釋調NSLog嗎?假如工程如今原來基礎上發佈一個version 1.2版本的,咱們在修改程序的時候豈不是還把原來註釋給取消,那就很麻煩很麻煩了。

因此,此處用到了宏指令,上段代碼的意思就是 用宏指令作一個判斷,若是DEBUG爲真,則編譯#ifdef到#endif宏定義,不然編譯器就不編譯;

這個DEBUG在哪設置呢?在 "Target > Build Settings > Preprocessor Macros > Debug" 裏有一個"DEBUG=1"。

當Run  Test  Profile  Analyze  Archive的時候,均可以根據須要設置Debug和Release兩個模式運行;因此咱們徹底能夠用一個宏指令來設置是否打印調試信息

相關文章
相關標籤/搜索