开源中国iOS客户端学习——(一)Prefix.pch文件

转载 2013年12月02日 17:39:09

当我们新建一个工程的时候,在Supporting FIles文件下会看到一个以  -Prefix.pch结尾文件的文件,pch全称是“precompiled header”,也就是预编译头文件,该文件里存放的工程中一些不常被修改的代码,比如常用的框架头文件,这样做的目的提高编译器编译速度。我们知道当我们修改一个工程中某个文件代码时候,编译器并不是重新编译所有所有文件,而是编译改动过文件的,假如pch中某个文件修改了,那么pch整个文件里包含的的其他文件也会重新编译一次,这样就会消耗大量时间,所以它里面添加的文件最好是是很少变动或不变动的头文件或者是预编译的代码片段;


在新建一个工程时,pch后缀文件里代码是

  1. #import <Availability.h>  
  2.   
  3. #ifndef __IPHONE_4_0  
  4. #warning "This project uses features only available in iOS SDK 4.0 and later."  
  5. #endif  
  6.   
  7. #ifdef __OBJC__  
  8.     #import <UIKit/UIKit.h>  
  9.     #import <Foundation/Foundation.h>  
  10. #endif  

或许你会觉得这预编译代码很少,但是你可以查看一下UIKit.h的定义文件中

  1. //  
  2. //  UIKit.h  
  3. //  UIKit  
  4. //  
  5. //  Copyright (c) 2005-2011, Apple Inc. All rights reserved.  
  6. //  
  7.   
  8. #import <UIKit/UIKitDefines.h>  
  9. #import <UIKit/UIAccelerometer.h>  
  10. #import <UIKit/UIAccessibility.h>   
  11. #import <UIKit/UIActivityIndicatorView.h>  
  12. #import <UIKit/UIAlert.h>  
  13. #import <UIKit/UIApplication.h>  
  14. #import <UIKit/UIBarButtonItem.h>  
  15. #import <UIKit/UIBarItem.h>  
  16. #import <UIKit/UIBezierPath.h>  
  17. #import <UIKit/UIButton.h>  
  18. #import <UIKit/UIColor.h>  
  19. #import <UIKit/UIControl.h>  
  20. #import <UIKit/UIDataDetectors.h>  
  21. #import <UIKit/UIDatePicker.h>  
  22. #import <UIKit/UIDevice.h>  
  23. #import <UIKit/UIDocument.h>  
  24. #import <UIKit/UIDocumentInteractionController.h>  
  25. #import <UIKit/UIEvent.h>  
  26. #import <UIKit/UIFont.h>  
  27. #import <UIKit/UIGeometry.h>  
  28. #import <UIKit/UIGestureRecognizer.h>  
  29. #import <UIKit/UIGraphics.h>  
  30. #import <UIKit/UIImage.h>  
  31. #import <UIKit/UIImagePickerController.h>  
  32. #import <UIKit/UIImageView.h>  
  33. #import <UIKit/UIInterface.h>  
  34. #import <UIKit/UILabel.h>  
  35. #import <UIKit/UILocalNotification.h>  
  36. #import <UIKit/UILocalizedIndexedCollation.h>  
  37. #import <UIKit/UILongPressGestureRecognizer.h>  
  38. #import <UIKit/UIManagedDocument.h>  
  39. #import <UIKit/UIMenuController.h>  
  40. #import <UIKit/UINavigationBar.h>  
  41. #import <UIKit/UINavigationController.h>  
  42. #import <UIKit/UINib.h>  
  43. #import <UIKit/UINibDeclarations.h>  
  44. #import <UIKit/UINibLoading.h>  
  45. #import <UIKit/UIPageControl.h>  
  46. #import <UIKit/UIPageViewController.h>  
  47. #import <UIKit/UIPanGestureRecognizer.h>  
  48. #import <UIKit/UIPasteboard.h>  
  49. #import <UIKit/UIPickerView.h>  
  50. #import <UIKit/UIPinchGestureRecognizer.h>  
  51. #import <UIKit/UIPopoverController.h>  
  52. #import <UIKit/UIPopoverBackgroundView.h>  
  53. #import <UIKit/UIPrintError.h>  
  54. #import <UIKit/UIPrintFormatter.h>  
  55. #import <UIKit/UIPrintInfo.h>  
  56. #import <UIKit/UIPrintInteractionController.h>  
  57. #import <UIKit/UIPrintPageRenderer.h>  
  58. #import <UIKit/UIPrintPaper.h>  
  59. #import <UIKit/UIProgressView.h>  
  60. #import <UIKit/UIReferenceLibraryViewController.h>  
  61. #import <UIKit/UIResponder.h>  
  62. #import <UIKit/UIRotationGestureRecognizer.h>  
  63. #import <UIKit/UIScreen.h>  
  64. #import <UIKit/UIScreenMode.h>  
  65. #import <UIKit/UIScrollView.h>  
  66. #import <UIKit/UISearchBar.h>  
  67. #import <UIKit/UISearchDisplayController.h>  
  68. #import <UIKit/UISegmentedControl.h>  
  69. #import <UIKit/UISlider.h>  
  70. #import <UIKit/UISplitViewController.h>  
  71. #import <UIKit/UIStepper.h>  
  72. #import <UIKit/UIStoryboard.h>  
  73. #import <UIKit/UIStoryboardPopoverSegue.h>  
  74. #import <UIKit/UIStoryboardSegue.h>  
  75. #import <UIKit/UIStringDrawing.h>  
  76. #import <UIKit/UISwipeGestureRecognizer.h>  
  77. #import <UIKit/UISwitch.h>  
  78. #import <UIKit/UITabBar.h>  
  79. #import <UIKit/UITabBarController.h>  
  80. #import <UIKit/UITabBarItem.h>  
  81. #import <UIKit/UITableView.h>  
  82. #import <UIKit/UITableViewCell.h>  
  83. #import <UIKit/UITableViewController.h>  
  84. #import <UIKit/UITapGestureRecognizer.h>  
  85. #import <UIKit/UITextField.h>  
  86. #import <UIKit/UITextInput.h>  
  87. #import <UIKit/UITextInputTraits.h>  
  88. #import <UIKit/UITextView.h>  
  89. #import <UIKit/UIToolbar.h>  
  90. #import <UIKit/UITouch.h>  
  91. #import <UIKit/UIVideoEditorController.h>  
  92. #import <UIKit/UIView.h>  
  93. #import <UIKit/UIViewController.h>  
  94. #import <UIKit/UIWebView.h>  
  95. #import <UIKit/UIWindow.h>  

这些不少了吧,工程每次运行都编译是不是很费时间,这些是苹果公司内部定义的标准头文件,我们不能也没有权限修改这些头文件定义内容,所以,当放到pch文件中会加速编译过程;


再来看看我们开源中国iOS客户端pch文件

  1. //  
  2. // Prefix header for all source files of the 'oschina' target in the 'oschina' project  
  3. //  
  4.   
  5. #import <Availability.h>  
  6.   
  7. #ifndef __IPHONE_4_0  
  8. #warning "This project uses features only available in iOS SDK 4.0 and later."  
  9. #endif  
  10.   
  11. #ifdef __OBJC__  
  12.     #import <UIKit/UIKit.h>  
  13.     #import <Foundation/Foundation.h>  
  14.     #import <CoreData/CoreData.h>  
  15.     #import <QuartzCore/QuartzCore.h>  
  16. //添加的预编译  
  17. #import "ASIHTTPRequest.h"  
  18. #import "ASIFormDataRequest.h"  
  19. #import "ASIHTTPRequestDelegate.h"  
  20. #import "ASIHTTPRequestConfig.h"  
  21. #import "TBXML.h"  
  22. #import "TBXML+HTTP.h"  
  23. #import "TBXML+Compression.h"  
  24. #import "Config.h"  
  25. #import "EGORefreshTableHeaderView.h"  
  26. #import "DataSingleton.h"  
  27. #import "ImgRecord.h"  
  28. #import "IconDownloader.h"  
  29. #import "MBProgressHUD.h"  
  30. #import "GCDiscreetNotificationView.h"  
  31. #import "NdUncaughtExceptionHandler.h"  
  32. #import "JSNotifier.h"  
  33. #import "AFOSCClient.h"  
  34. #import "AFHTTPRequestOperation.h"  
  35. #import "AFXMLRequestOperation.h"  
  36.   
  37. //api定义  
  38.   
  39. #define api_news_list @"http://www.oschina.net/action/api/news_list"  
  40. #define api_news_detail @"http://www.oschina.net/action/api/news_detail"  
  41. #define api_post_list @"http://www.oschina.net/action/api/post_list"  
  42. #define api_post_detail @"http://www.oschina.net/action/api/post_detail"  
  43. #define api_post_pub @"http://www.oschina.net/action/api/post_pub"  
  44. #define api_tweet_list @"http://www.oschina.net/action/api/tweet_list"  
  45. #define api_tweet_detail @"http://www.oschina.net/action/api/tweet_detail"  
  46. #define api_tweet_delete @"http://www.oschina.net/action/api/tweet_delete"  
  47. #define api_tweet_pub @"http://www.oschina.net/action/api/tweet_pub"  
  48. #define api_active_list @"http://www.oschina.net/action/api/active_list"  
  49. #define api_message_list @"http://www.oschina.net/action/api/message_list"  
  50. #define api_message_delete @"http://www.oschina.net/action/api/message_delete"  
  51. #define api_message_pub @"http://www.oschina.net/action/api/message_pub"  
  52. #define api_comment_list @"http://www.oschina.net/action/api/comment_list"  
  53. #define api_comment_pub @"http://www.oschina.net/action/api/comment_pub"  
  54. #define api_comment_reply @"http://www.oschina.net/action/api/comment_reply"  
  55. #define api_comment_delete @"http://www.oschina.net/action/api/comment_delete"  
  56. #define api_login_validate @"https://www.oschina.net/action/api/login_validate"  
  57. #define api_user_info @"http://www.oschina.net/action/api/user_info"  
  58. #define api_user_information @"http://www.oschina.net/action/api/user_information"  
  59. #define api_user_updaterelation @"http://www.oschina.net/action/api/user_updaterelation"  
  60. #define api_notice_clear @"http://www.oschina.net/action/api/notice_clear"  
  61. #define api_software_detail @"http://www.oschina.net/action/api/software_detail"  
  62. #define api_blog_detail @"http://www.oschina.net/action/api/blog_detail"  
  63. #define api_favorite_list @"http://www.oschina.net/action/api/favorite_list"  
  64. #define api_favorite_add @"http://www.oschina.net/action/api/favorite_add"  
  65. #define api_favorite_delete @"http://www.oschina.net/action/api/favorite_delete"  
  66. #define api_user_notice @"http://www.oschina.net/action/api/user_notice"  
  67. #define api_search_list @"http://www.oschina.net/action/api/search_list"  
  68. #define api_friends_list @"http://www.oschina.net/action/api/friends_list"  
  69. #define api_softwarecatalog_list @"http://www.oschina.net/action/api/softwarecatalog_list"  
  70. #define api_software_list @"http://www.oschina.net/action/api/software_list"  
  71. #define api_softwaretag_list @"http://www.oschina.net/action/api/softwaretag_list"  
  72. #define api_blogcomment_list @"http://www.oschina.net/action/api/blogcomment_list"  
  73. #define api_blogcomment_pub @"http://www.oschina.net/action/api/blogcomment_pub"  
  74. #define api_my_information @"http://www.oschina.net/action/api/my_information"  
  75. #define api_blogcomment_delete @"http://www.oschina.net/action/api/blogcomment_delete"  
  76. #define api_userblog_delete @"http://www.oschina.net/action/api/userblog_delete"  
  77. #define api_userblog_list @"http://www.oschina.net/action/api/userblog_list"  
  78. #define api_blog_list @"http://www.oschina.net/action/api/blog_list"  
  79. #define api_userinfo_update @"http://www.oschina.net/action/api/portrait_update"  
  80.   
  81. //宏定义 新闻  
  82. #define TweetCellIdentifier @"TweetCellIdentifier"  
  83. #define loadMoreIdentifier @"loadMoreIdentifier"  
  84. #define NewsCellIdentifier @"NewsCellIdentifier"  
  85. #define PostCellIdentifier @"PostCellIdentifier"  
  86. #define MsgCellIdentifier @"MsgCellIdentifier"  
  87. #define MsgUnitCellIdentifier @"MsgUnitCellIdentifier"  
  88. #define ActiveCellIdentifier @"ActiveCellIdentifier"  
  89. #define UserActiveCellIdentifier @"UserActiveCellIdentifier"  
  90. #define ColorActiveCellIdentifier @"ColorActiveCellIdentifier"  
  91. #define RTActiveCellIdentifier @"RTActiveCellIdentifier"  
  92. #define ColorUserActiveCellIdentifier @"ColorUserActiveCellIdentifier"  
  93. #define ProfielCellIdentifier @"ProfielCellIdentifier"  
  94. #define CommentCellIdentifier @"CommentCellIdentifier"  
  95. #define NormalCellIdentifier @"NormalCellIdentifier"  
  96. #define FavoriteCellIdentifier @"FavoriteCellIdentifier"  
  97. #define FriendCellIdentifier @"FriendCellIdentifier"  
  98. #define SoftwareCellIdentifier @"SoftwareCellIdentifier"  
  99. #define SoftwareCatalogIdentifier @"SoftwareCatalogIdentifier"  
  100. #define SettingTableIdentifier @"SettingTableIdentifier"  
  101. #define MyInfoCellIdentifier @"MyInfoCellIdentifier"  
  102. #define MyPortraitCellIdentifier @"MyPortraitCellIdentifier"  
  103.   
  104. #define loadNext20Tip @"下面 20 项 . . ."  
  105. #define loadingTip @"正在加载 . . ."  
  106. #define networkError @"网络无连接"  
  107. #define noNetworkTip @"网络无连接"  
  108.   
  109. //消息通知固定字符串  
  110. #define Notification_DetailCommentCount @"Notification_DetailCommentCount"  
  111. #define Notification_NoticeUpdate @"Notification_NoticeUpdate"  
  112. #define Notification_TabClick @"Notification_TabClick"  
  113.   
  114. //html头部  
  115. #define HTML_Style @"<style>#oschina_title {color: #000000; margin-bottom: 6px; font-weight:bold;}#oschina_title img{vertical-align:middle;margin-right:6px;}#oschina_title a{color:#0D6DA8;}#oschina_outline {color: #707070; font-size: 12px;}#oschina_outline a{color:#0D6DA8;}#oschina_software{color:#808080;font-size:12px}#oschina_body img {max-width: 300px;}#oschina_body {font-size:16px;max-width:300px;line-height:24px;} #oschina_body table{max-width:300px;}#oschina_body pre { font-size:9pt;font-family:Courier New,Arial;border:1px solid #ddd;border-left:5px solid #6CE26C;background:#f6f6f6;padding:5px;}</style>"  
  116. #define HTML_Bottom @"<div style='margin-bottom:60px'/>"  
  117.   
  118. #define USERAGENT @"OSChina.NET/iOS/5.0"  
  119.   
  120. #define AppVersion @"1.6.1"  
  121.   
  122. #ifdef DEBUG  
  123. #define debugLog(...) NSLog(__VA_ARGS__)  
  124. #define debugMethod() NSLog(@"%s", __func__)  
  125. #else  
  126. #define debugLog(...)  
  127. #define debugMethod()  
  128. #endif  
  129.   
  130. #endif  


我们看到有这样些文件也被添加到里面,可能会想难道这些头文件变化不大吗?

  1. //添加的预编译  
  2. #import "ASIHTTPRequest.h"  
  3. #import "ASIFormDataRequest.h"  
  4. #import "ASIHTTPRequestDelegate.h"  
  5. #import "ASIHTTPRequestConfig.h"  
  6. #import "TBXML.h"  
  7. #import "TBXML+HTTP.h"  
  8. #import "TBXML+Compression.h"  
  9. #import "Config.h"  
  10. #import "EGORefreshTableHeaderView.h"  
  11. #import "DataSingleton.h"  
  12. #import "ImgRecord.h"  
  13. #import "IconDownloader.h"  
  14. #import "MBProgressHUD.h"  
  15. #import "GCDiscreetNotificationView.h"  
  16. #import "NdUncaughtExceptionHandler.h"  
  17. #import "JSNotifier.h"  
  18. #import "AFOSCClient.h"  
  19. #import "AFHTTPRequestOperation.h"  
  20. #import "AFXMLRequestOperation.h"  
其实,这些文件特殊之处在于他们都是第三方类库的头文件,第三方类库将一些对象进行高度封装,留下接口,然后我们根据类库接口直接调用就可以,这些第三方类库一般都比iOS原生自带的更加简单易用,比如TBXML解析库,比iOS自带的NSXMLPaser解析器速度功能上都会好一些;


还有一些宏定义都是比较常用方式的宏定义,比如定义的开源中国社区的api接口,这些接口变得当然很少了;


然后就剩下最后面的

  1. #ifdef DEBUG  
  2. #define debugLog(...) NSLog(__VA_ARGS__)  
  3. #define debugMethod() NSLog(@"%s", __func__)  
  4. #else  
  5. #define debugLog(...)  
  6. #define debugMethod()  
  7. #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"。


现在我们来做一个测试:

取一个宏指令放到OSAppDelegate.m的application:didFinishLaunchingWithOptions:方法中,并用同一个NSLog做一个对比;

NSLog(@"%s", __func__);

 debugMethod();



首先设置为Debug模式下,Product-->Edit Scheme

跳转到这个界面


当我设置Build Configuration成Debug时,打印效果图


当我设置Build Configuration成Release的,打印时效果图


当Run  Test  Profile  Analyze  Archive的时候,都可以根据需要设置Debug和Release两个模式运行;

所以我们完全可以用一个宏指令来设置是否打印调试信息;




欢迎转载分享,请注明出处http://blog.csdn.net/duxinfeng2010


相关文章推荐

开源中国iOS客户端学习——(一)Prefix.pch文件

当我们新建一个工程的时候,在Supporting FIles文件下会看到一个以  -Prefix.pch结尾文件的文件,pch全称是“precompiled header”,也就是预编译头文件,该文件...

开源中国iOS客户端学习——(十二)用户登陆

上一篇博客  开源中国iOS客户端学习——(十一)AES加密 中提到将用户名和密码保存到了本地沙盒之中,在从本地读取用户名和密码,这是一个怎样的过程? -(void)saveUserNameAndP...

开源中国iOS客户端学习——(四)GCDiscreetNotificationView提示视图

GCDiscreetNotificationView 类库作用是: 在不阻止用户与设备应用程序交互情况下,作为一个通知视图来显示一个当前的状态。 GCDiscreetNotificationVi...

开源中国iOS客户端学习——(十四)使用EGOImageLoading异步加载图片

EGOImageLoading 是一个用的比较多的异步加载图片的第三方类库,简化开发过程,我们直接传入图片的url,这个类库就会自动帮我们异步加载和缓存工作;当从网上获取图片时,如果网速慢图片短时间内...

开源中国iOS客户端学习——(八)网络通信AFNetworking类库

转载自:http://blog.csdn.net/duxinfeng2010/article/details/8620901   开源中国iOS客户端学习——(八)网络通信AF...

开源中国iOS客户端学习——(十一)AES加密

2013-05-22 11:14 13473人阅读 评论(10) 收藏 举报 开源中国iOS客户端学习AES加密 http://blog.csdn.net/duxinfeng2010/ar...

开源中国iOS客户端学习——(五)网络通信ASI类库(1)

如今的应用大部分基予网络,在开源中国iOS客户端源码中关于网络通信方面用了三个类库,ASI和AFNetworking,还有一个苹果官方给出的Reachability用于检测当前网络状况,本文介绍当前用...

开源中国iOS客户端学习——(九)代码片段之时间标记

开源中国客户端中无论是综合里面文章,还是问答里问题还是动弹离得说说,每一条后面都会注释有时间,比如“10分钟之前”  “2小时前” “5天前” 或者直接是时间显示“2013-2-9”等,这些时间在很多...

开源中国iOS客户端学习——(十三)使用UIWebView控件布局视图

在上一篇博客   开源中国iOS客户端学习——(十二)用户登陆  中讲到用户登陆界面,loginView.xib布局中我们看到有一个UIWebView控件,但是它并没有加载一个网页,而是显示一些文...

开源中国iOS客户端学习——(三)再看协议与委托

iOS里委托与协议是很重要的一块,如果理解不好很难区分协议与委托到底有什么不一样,这些东西在开发中是经常遇见的; 协议是类留给外部的一个接口函数的集合(一位高手用C++基类来解释是,把接口做为参数,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开源中国iOS客户端学习——(一)Prefix.pch文件
举报原因:
原因补充:

(最多只允许输入30个字)