天天看點

Xcode 常用編譯選項設定【推薦】

原文來自:http://www.lanou3g.com/blog/post-5.html

Xcode 常用編譯選項設定

Xcode 常用編譯選項設定【推薦】

在xcconfig檔案中指定即可。

用标準庫連接配接

LINK_WITH_STANDARD_LIBRARIES = YES如果激活此設定,那麼編譯器在連結過程中會自動使用通過标準庫的連結器。 

Info.plist 輸出編碼

INFOPLIST_OUTPUT_FORMAT = binary指定Info.plist檔案的輸出編碼(預設情況下,輸出與輸入的編碼保持不變),這個輸出編碼能指定“binary”或者“XML”。 

生 成調試符号GCC_GENERATE_DEBUGGING_SYMBOLS = NO當啟用的時候,詳情等級能夠通過build的’Level of Debug Symbols’設定去控制。 隐藏内聯方法GCC_INLINES_ARE_PRIVATE_EXTERN = YES Objective-C GCGCC_ENABLE_OBJC_GC = Unsupported 優化級别GCC_OPTIMIZATION_LEVEL = Fastest, Smallest   [-OS]

  • None: 不做優化使用這個設定,編譯器的目标是減少編譯成本,使調試産生預期的結果。
  • Fast:優化編譯将為大函數占用更多的時間和記憶體使用這個設定,編譯器将嘗試減少代碼的大小和執行時間,不進行任何優化,需要大量編譯時間。
  • Faster:編譯器執行幾乎所有支援的優化,它不考慮空間和速度之間的平衡與“Fast”設定相比,該設定會增加編譯時間和生成代碼的性能。編譯器不進行循環展開、内聯函數和寄存器變量的重命名。
  • Fastest:開啟“Faster”支援的所有的優化,同時也開啟内聯函數和寄存器變量的重命名選項
  • Fastest,smallest:優化代碼大小這個設定啟用“Faster”所有的優化,一般不增加代碼大小,它還執行旨在減小代碼大小的進一步優化。

C 語言方言GCC_C_LANGUAGE_STANDARD = C89 警告 檢查Switch語句GCC_WARN_CHECK_SWITCH_STATEMENTS = YES 隐藏局部變量GCC_WARN_SHADOW = YES 隐式轉換成32位的類型GCC_WARN_64_TO_32_BIT_CONVERSION = YES 未完成的Objective-C協定GCC_WARN_ALLOW_INCOMPLETE_PROTOCOL = YES 抑制所有的警告GCC_WARN_INHIBIT_ALL_WARNINGS = NO 初始化時沒有完整的括号GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES例子(a沒有完全的括号,b有): 

  1. int a[ 2 ][ 2 ] = { 0, 1, 2, 3 };
  
  2. int b[ 2 ][ 2 ] = { { 0, 1 }, { 2, 3 } };  

不比對的傳回類型

GCC_WARN_ABOUT_RETURN_TYPE = YES 缺少括号GCC_WARN_MISSING_PARENTHESES = YES例子:

  1. {  
  2.     if( a )  
  3.         if( b )  
  4.             foo();  
  5.         else  
  6.             bar();  
  7. }  
  1. {  
  2.     if( a )  
  3.     {  
  4.         if( b )  
  5.             foo();  
  6.         else  
  7.             bar();  
  8.     }  
  9. }  

在結構體初始化時缺少字段

GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES

 缺 少函數原型GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES 在檔案結尾缺少新行GCC_WARN_ABOUT_MISSING_NEWLINE = YES 選擇了多個定義的類型(@Selector)GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = NO 嚴格的Selector比對GCC_WARN_STRICT_SELECTOR_MATCH = YES 把缺少函數原型當作錯誤GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES 把所有的警告當作錯誤GCC_TREAT_WARNINGS_AS_ERRORS = YES 未定義的SelectorGCC_WARN_UNDECLARED_SELECTOR = YES 未初始化的自動變量GCC_WARN_UNINITIALIZED_AUTOS = YES 未知的Pragma指令GCC_WARN_UNKNOWN_PRAGMAS = YES 未使用的函數GCC_WARN_UNUSED_FUNCTION = YES 未使用的标簽GCC_WARN_UNUSED_LABEL = YES 未使用的參數GCC_WARN_UNUSED_PARAMETER = YES 未使用的值GCC_WARN_UNUSED_VALUE = YES當一個語句計算的結果顯式的未使用的時候發出警告 未使用的變量GCC_WARN_UNUSED_VARIABLE = YES 警告-所有過時的函數GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES offsetof宏未定義使用的警告GCC_WARN_ABOUT_INVALID_OFFSETOF_MACRO = YES

iphone 常用的<app>-info.plist設定

Application requires iPhone environment如 果應用程式不能在ipod touch上運作,設定此項為true; 

Application uses Wi-Fi如果應用程式需要wi-fi才能工作,應該将此屬性設定為true。這麼做會提示使用者,如果沒有打開wi-fi的話,打開wi-fi。為了節省 電力,iphone會在30分鐘後自動關閉應用程式中的任何wi-fi。設定這一個屬性可以防止這種情況的發生,并且保持連接配接處于活動狀态 

Bundle display name這用于設定應用程式的名稱,它顯示在iphone螢幕的圖示下方。應用程式名稱限制在10-12個字元,如果超出,iphone将縮寫名 稱。 

Bundle identifier這個為應用程式在iphone developer program portal web站點上設定的唯一辨別符。(就是你安裝證書的時候,需要把這裡對應修改)。 

Bundle version這個會設定應用程式版本号,每次部署應用程式的一個新版本時,将會增加這個編号,在app store用的。

 Icon already includes gloss and bevel effects預設情況下,應用程式被設定了玻璃效果,把這個設定為true可以阻止這麼做。 

Icon file(這個不用多說了)設定應用程式圖示的。 

Main nib file base name應用程式首次啟動時載入的xib檔案 這個基本用不到。

 Initial interface orientation 确定了應用程式以風景模式還是任務模式啟動 

Localizations多語言。應用程式本地化的一清單,期間用逗号隔開,例如 應用程式支援英語 日語,将會适用 English,Japanese. Status bar is initially hidden 設定是否隐藏狀态欄。你懂的。

 Status bar style選擇三種不同格式種的一種。

 URL types應用程式支援的url辨別符的一個數組。

用URL Scheme進行程式跳轉

打開info.plist,添加一項URL types

展開URL types,再展開Item1,将Item1下的URL identifier修改為URL Scheme

展開URL Scheme,将Item1的内容修改為myapp

其他程式可通過myapp://通路此自定義URL

參考:http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html

IOS背景播放音樂

OS背景播放隻是在IOS4.0以後的版本支援。

1,設定背景播放會話

AVAudioSession *session = [AVAudioSession sharedInstance];

[session setActive:YES error:nil];

[session setCategory:AVAudioSessionCategoryPlayback error:nil];

2,在info.plist裡面添加

<key>UIBackgroundModes</key>

<array>

<string>audio</string>

</array>

靜态庫沒法包含category/分類?

如果你導入一個objc靜态庫,發現很多objc的category 不能調用,可以嘗試在主工程中加入linker選項:

-all_load 加入這個一般就夠了

-ObjC

讓程式最小化再開啟時,從頭開始:

按下 “Home” 鍵以後程式可能并沒有退出而是轉入了背景運作。如果您想讓應用直接退出,最簡單的方法是:在 info-plist 裡面找到 Application does not run in background 一項,勾選即可。

程式退出後工作列還是有圖示,但是程式原來的所有運作狀态全部丢失,點選工作列圖示也不過相當于再次啟動程式;如果允許背景運作,點選工作列圖示後會恢複程式中斷時的界面。

本地化字元串:

在infoPlist.strings裡面寫

“string1″=”水果”

代碼裡面寫 myLabel.text = NSLocalizedString(@”string1″, nil);

本地化的Bundle display name:

1)建立一個空檔案,取名為InfoPlist.strings

2)對InfoPlist.strings進行本地化(Get Info  -> Make Localization),然後設定需要的語言(如中文zh)

3)編輯不同的InfoPlist.strings檔案,設定顯示名字

CFBundleDisplayName = “名字”; 

4)(這步不做貌似也可以)編輯Info.plist,添加一個新的屬性Application has localized display name, 設定其類型為boolean,并将其value設定為選中狀态

default圖檔的銜接問題:

程式開始後,手動加載default圖檔,然後進行過渡效果即可。

周遊目錄:

NSString *appDocDir = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] relativePath];NSArray *contentOfFolder = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:appDocDir error:NULL];for (NSString *aPath in contentOfFolder) { NSLog(@"apath: %@", aPath); NSString * fullPath = [appDocDir stringByAppendingPathComponent:aPath]; BOOL isDir; if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDir] && !isDir) { [fileList addObject:aPath]; }}

IB:

不論寫不寫property的retain,由IBOutlet都會為對象加一個retainCount,是以隻要連接配接了,就需要在viewDidUnload與dealloc中release并适當置為nil。

預先在IB裡面加載好的檔案(比如圖檔),即使釋放了Controller,IB中的檔案也不會被釋放,直至記憶體警告,解決辦法是較大的資源用代碼加載。

UIWebView:

用代碼加載UIWebView的内容,navigationType是UIWebViewNavigationTypeOther

CAAnimation:

一定要記得[self.view.layer removeAllAnimations];因為CAAnimation會retain它的delegate

裝置型号識别,可通過稽核:

+ (NSString*)getDeviceVersion{ size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = (char*)malloc(size); sysctlbyname("hw.machine", machine, &size, NULL, 0); NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding]; free(machine); return platform;}

輸出:

//@”iPad1,1″ 

//@”iPad2,1″ 

//@”i386″

逗号後面數字解釋:(i386是指模拟器)

1-WiFi版

2-GSM/WCDMA 3G版

3-CDMA版

AppleTV(2G) (AppleTV2,1)

iPad (iPad1,1)

iPad2,1 (iPad2,1)Wifi版

iPad2,2 (iPad2,2)GSM3G版

iPad2,3 (iPad2,3)CDMA3G版

iPhone (iPhone1,1)

iPhone3G (iPhone1,2)

iPhone3GS (iPhone2,1)

iPhone4 (iPhone3,1)

iPhone4(vz) (iPhone3,3)iPhone4 CDMA版

iPhone4S (iPhone4,1)

iPodTouch(1G) (iPod1,1)

iPodTouch(2G) (iPod2,1)

iPodTouch(3G) (iPod3,1)

iPodTouch(4G) (iPod4,1)

判斷ipad/iphone

12UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPadUI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone

或者

1[[[UIDevice currentDevice] model] isEqualToString:@"iPad"];

判斷裝置是否有攝像頭

1[UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];