xcode添加編譯選項
A. 如何在使Xcode打包iOS應用時自動增加編譯號
方法/步驟
選擇「Build Phases」選項卡
之後,每次打包,紅框標注的編譯號都會增加1
B. ios開發中怎樣給xcode添加配置文件
本人覺得這個打包framework還是一個比較重要的功能,可以用來做一下事情: (1)封裝功能模塊,比如有比較成熟的功能模塊封裝成一個包,然後以後自己或其他同事用起來比較方便。 (2)封裝項目,有時候會遇到這個情況,就是一家公司找了兩個開發公司做兩個項目,然後要求他們的項目中的一個嵌套進另一個項目,此時也可以把唄嵌套的項目打包成framework放進去,這樣比較方便。 我們為什麼需要框架(Framework)? 要想用一種開發者友好的方式共享庫是很麻煩的。你不僅僅需要包含庫本身,還要加入所有的頭文件,資源等等。 蘋果解決這個問題的方式是框架(framework)。基本上,這是含有固定結構並包含了引用該庫時所必需的所有東西的文件夾。不幸的是,iOS禁止所有的動態庫。同時,蘋果也從Xcode中移除了創建靜態iOS框架的功能。 Xcode仍然可以支持創建框架的功能,重啟這個功能,我們需要對Xcode做一些小小的改動。 把代碼封裝在靜態框架是被app store所允許的。盡管形式不同,本質上它仍然是一種靜態庫。 框架(Framework)的類別 大部分框架都是動態鏈接庫的形式。因為只有蘋果才能在iOS設備上安裝動態庫,所以我們無法創建這種類型的框架。 靜態鏈接庫和動態庫一樣,只不過它是在編譯時鏈接二進制代碼,因此使用靜態庫不會有動態庫那樣的問題(即除了蘋果誰也不能在iOS上使用動態庫)。 “偽”框架是通過破解Xcode的目標Bundle(使用某些腳本)來實現的。它在表面上以及使用時跟靜態框架並無區別。“偽”框架項目的功能幾乎和真實的框架項目沒有區別(不是全部)。 “嵌入”框架是靜態框架的一個包裝,以便Xcode能獲取框架內的資源(圖片、plist、nib等)。 本次發布包括了創建靜態框架和“偽”框架的模板,以及二者的“嵌入”框架。 用哪一種模板? 本次發布有兩個模板,每個模板都有“強”“弱”兩個類別。你可以選擇最適合一種(或者兩種都安裝上)。 最大的不同是Xcode不能創建“真”框架,除非你安裝靜態框架文件xcspec在Xcode中。這真是一個遺憾(這個文件是給項目使用的,而不是框架要用的)。 簡單說,你可以這樣決定用哪一種模板: 如果你不想修改Xcode,那麼請使用“偽”框架版本 如果你只是想共享二進制(不是項目),兩種都可以 如果你想把框架共享給不想修改Xcode的開發者,使用“偽”框架版本 如果你想把框架共享給修改過Xcode的開發者,使用“真”框架版本 如果你想把框架項目作為另一個項目的依賴(通過workspace或者子項目的方式),請使用“真”框架(或者“偽”框架,使用-framework——見後) 如果你想在你的框架項目中加入其他靜態庫/框架,並把它們也鏈接到最終結果以便不需要單獨添加到用戶項目中,使用“偽”框架 “偽”框架 “偽”框架是破解的“reloacatable object file”(可重定位格式的目標文件, 保存著代碼和數據,適合於和其他的目標文件連接到一起,用來創建一個可執行目標文件或者是一個可共享目標文件),它可以讓Xcode編譯出類似框架的東西——其實也是一個bundle。 “偽框架”模板把整個過程分為幾個步驟,用某些腳本去產生一個真正的靜態框架(基於靜態庫而不是reloacatable object file)。而且,框架項目還是把它定義為wrapper.cfbundle類型,一種Xcode中的“二等公民”。 因此它跟“真”靜態框架一樣可以正常工作,但當存在依賴關系時就有麻煩了。 依賴問題 如果不使用依賴,只是創建普通的項目是沒有任何問題的。但是如果使用了項目依賴(比如在workspace中),Xcode就悲劇了。當你點擊“Link Binary With Libraries”下方的’+’按鈕時,“偽框架”無法顯示在列表中。你可以從你的“偽”框架項目的Procts下面將它手動拖入,但當你編輯你的主項目時,會出現警告: warning: skipping file '/somewhere/MyFramework.framework' (unexpectedfile type 'wrapper.cfbundle' in Frameworks & Libraries build phase) 並伴隨“偽”框架中的鏈接錯誤。 幸運的是,有個辦法來解決它。你可以在”Other Linker Flags”中用”-framwork”開關手動告訴linker去使用你的框架進行鏈接: -framework MyFramework 警告仍然存在,但起碼能正確鏈接了。 添加其他的庫/框架 如果你加入其他靜態(不是動態)庫/框架到你的“偽”框架項目中,它們將“鏈接”進你最終的二進制框架文件中。在“真”框架項目中,它們是純引用,而不是鏈接。 你可以在項目中僅僅包含頭文件而不是靜態庫/框架本身的方式避免這種情況(以便編譯通過)。 “真”框架 “真”框架各個方面都符合“真”的標准。它是真正的靜態框架,正如使用蘋果在從Xcode中去除的那個功能所創建的一樣。 為了能創建真正的靜態框架項目,你必需在Xcode中安裝一個xcspec文件。 如果你發布一個“真”框架項目(而不是編譯),希望去編譯這個框架的人必需也安裝xcspec文件(使用本次發布的安裝腳本),以便Xcode能理解目標類型。 注意:如果你正在發布完全編譯的框架,而不是框架項目,最終用戶並不需要安裝任何東西。 我已經提交一個報告給蘋果,希望他們在Xcode中更新這個文件,但那需要一點時間.OpenRadarlink here 加其他靜態庫/框架 如果你加入其他靜態(不是動態)庫/框架到你的“真”框架項目,它們只會被引用,而不會象“偽”框架一樣被鏈接到最終的二進制文件中。 從早期版本升級 如果你是從Mk6或者更早的版本升級,同時使用“真”靜態框架,並且使用Xcode4.2.1以前的版本,請運行uninstall_legacy.sh以卸載早期用於Xcode的所有修正。然後再運行install.sh,重啟Xcode。如果你使用Xcode4.3以後,只需要運行install.sh並重啟Xcode。 安裝 分別運行Real Framework目錄或Fake Framework目錄下的install.sh腳本進行安裝(或者兩個你都運行)。 重啟Xcode,你將在新項目向導的Framework&Library下看到StaticiOS Framework(或者Fake Static iOS Framework)。 卸載請運行unistall.sh腳本並重啟Xcode。 創建一個iOS框架項目 創建新項目。 項目類型選擇Framework&Library下的Static iOS Framework(或者Fake Static iOS Framework)。 選擇“包含單元測試”(可選的)。 在target中加入類、資源等。 凡是其他項目要使用的頭文件,必需聲明為public。進入target的Build Phases頁,Copy Headers項,把需要public的頭文件從Project或Private部分拖拽到Public部分。 編譯你的 iOS 框架 選擇指定target的scheme 修改scheme的Run配置(可選)。Run配置默認使用Debug,但在准備部署的時候你可能想使用Release。 編譯框架(無論目標為iOS device和Simulator都會編譯出相同的二進制,因此選誰都無所謂了)。 從Procts下選中你的framework,“show in Finder”。 在build目錄下有兩個文件夾:(yourframework).framework and (your framework).embeddedframework. 如果你的框架只有代碼,沒有資源(比如圖片、腳本、xib、coredata的momd文件等),你可以把(yourframework).framework 分發給你的用戶就行了。如果還包含有資源,你必需分發(your framework).embeddedframework給你的用戶。 為什麼需要embedded framework?因為Xcode不會查找靜態框架中的資源,如果你分發(your framework).framework, 則框架中的所有資源都不會顯示,也不可用。 一個embedded framework只是一個framework之外的附加的包,包括了這個框架的所有資源的符號鏈接。這樣做的目的是讓Xcode能夠找到這些資源。 使用iOS 框架 iOS框架和常規的Mac OS動態框架差不多,只是它是靜態鏈接的而已。 在你的項目中使用一個框架,只需把它拖僅你的項目中。在包含頭文件時,記住使用尖括弧而不是雙引號括住框架名稱。例如,對於框架MyFramework: #import 使用問題 Headers Not Found 如果Xcode找不到框架的頭文件,你可能是忘記將它們聲明為public了。參考“創建一個iOS框架項目”第5步。 No Such Proct Type 如果你沒有安裝iOS Universal Framework在Xcode,並企圖編譯一個universal框架項目(對於“真”框架,不是“假”框架),這會導致下列錯誤: target specifies proct type 'com.apple.proct-type.framework.static',but there's no such proct type for the 'iphonesimulator' platform 為了編譯“真”iOS靜態框架,Xcode需要做一些改動,因此為了編譯“真”靜態框架項目,請在所有的開發環境中安裝它(對於使用框架的用戶不需要,只有要編譯框架才需要)。 The selected run destination is not valid for this action 有時,Xcode出錯並載入了錯誤的active設置。首先,請嘗試重啟Xcode。如果錯誤繼續存在,Xcode產生了一個壞的項目(因為Xcode4的一個bug,任何類型的項目都會出現這個問題)。如果是這樣,你需要創建一個新項目重來一遍。 鏈接警告 第一次編譯框架target時,Xcdoe會在鏈接階段報告找不到文件夾: ld: warning: directory not found for option'-L/Users/myself/Library/Developer/Xcode/DerivedData/MyFramework-ccahfoccjqiognaqraesrxdyqcne/Build/Procts/Debug-iphoneos' 此時,可以clean並重新編譯target,警告會消除。 Core Data momd not found 對於框架項目和應用程序項目,Xcode會以不同的方式編譯momd(託管對象模型文件)。Xcode會簡單地在根目錄創建.mom文件,而不會創建一個.momd目錄(目錄中包含VersionInfo.plist和.mom文件)。 這意味著,當從一個embedded framework的model中實例化NSManagedObjectModel時,你必需使用.mom擴展名作為model的URL,而不是採用.momd擴展名。 NSURL *modelURL = [[NSBundle mainBundle]URLForResource:@"MyModel" withExtension:@"mom"]; Unknown class MyClass in Interface Builder file. 由於靜態框架採用靜態鏈接,linker會剔除所有它認為無用的代碼。不幸的是,linker不會檢查xib文件,因此如果類是在xib中引用,而沒有在O-C代碼中引用,linker將從最終的可執行文件中刪除類。這是linker的問題,不是框架的問題(當你編譯一個靜態庫時也會發生這個問題)。蘋果內置框架不會發生這個問題,因為他們是運行時動態載入的,存在於iOS設備固件中的動態庫是不可能被刪除的。 有兩個解決的辦法: 讓框架的最終用戶關閉linker的優化選項,通過在他們的項目的Other Linker Flags中添加-ObjC和-all_load。 在框架的另一個類中加一個該類的代碼引用。例如,假設你有個MyTextField類,被linker剔除了。假設你還有一個MyViewController,它在xib中使用了MyTextField,MyViewController並沒有被剔除。你應該這樣做: 在MyTextField中: + (void)forceLinkerLoad_ {} 在MyViewController中: +(void) initialize { [MyTextField forceLinkerLoad_]; } 他們仍然需要添加-ObjC到linker設置,但不需要強制all_load了。 第2種方法需要你多做一點工作,但卻讓最終用戶避免在使用你的框架時關閉linker優化(關閉linker優化會導致object文件膨脹)。 unexpected file type 'wrapper.cfbundle' in Frameworks &Libraries build phase 這個問題發生在把“假”框架項目作為workspace的依賴,或者把它當作子項目時(“真”框架項目沒有這個問題)。盡管這種框架項目產生了正確的靜態框架,但Xcode只能從項目文件中看出這是一個bundle,因此它在檢查依賴性時發出一個警告,並在linker階段跳過它。 你可以手動添加一個命令讓linker在鏈接階段能正確鏈接。在依賴你的靜態框架的項目的OtherLinker Flags中加入: -framework MyFramework 警告仍然存在, 但不會導致鏈接失敗。 Libraries being linked or not being linked into the finalframework 很不幸, “真”框架和“假”框架模板在處理引入的靜態庫/框架的工作方式不同的。 “真”框架模板採用正常的靜態庫生成步驟,不會鏈接其他靜態庫/框架到最終生產物中。 “假”框架模板採用“欺騙”Xcode的手段,讓它認為是在編譯一個可重定位格式的目標文件,在鏈接階段就如同編譯一個可執行文件,把所有的靜態代碼文件鏈接到最終生成物中(盡管不會檢查是否確實目標代碼)。為了實現象“真”框架一樣的效果,你可以只包含庫/框架的頭文件到你的項目中,而不需要包含庫/框架本身。 Unrecognized selector in (some class with a category method) 如果你的靜態庫或靜態框架包含了一個模塊(只在類別代碼中聲明,沒有類實現),linker會搞不清楚,並把代碼從二進制文件中剔除。因為在最終生成的文件中沒有這個方法,所以當調用這個類別中定義的方法時,會報一個“unrecognizedselector”異常。 要解決這個,在包含這個類別的模塊代碼中加一個“假的”類。linker發現存在完整的O-C類,會將類別代碼鏈接到模塊。 我寫了一個頭文件 LoadableCategory.h,以減輕這個工作量: #import "SomeConcreteClass+MyAdditions.h" #import "LoadableCategory.h" MAKE_CATEGORIES_LOADABLE(SomeConcreteClass_MyAdditions); @implementation SomeConcreteClass(MyAdditions) ... @end 在使用這個框架時,仍然還需要在Build Setting的Other Linker Flags中加入-ObjC。 執行任何代碼前單元測試崩潰 如果你在Xcode4.3中創建靜態框架(或庫)target時,勾選了“withunit tests”,當你試圖運行單元測試時,它會崩潰: Thread 1: EXC_BAD_ACCESS (code=2, address=0x0) 0 0x00000000 --- 15 dyldbootstrap:start(...) 這是lldb中的一個bug。你可以用GDB來運行單元測試。編輯scheme,選擇Test,在Info標簽中將調試器Debugger從LLDB改為GDB。
C. xcode怎麼在命令行添加target 編譯源文件
C++builder是最快的C++編譯器之一,從編譯速度來說也可以說是最快的win32C++編譯器了。除了速度之外,C++builder的性能也在其它C++編譯器的之上,但許多delphi程序員仍受不了c++builder工程的編譯速度。的確,delphi的速度要比任和c++的編譯器都要快好多。Delphi在編譯一個小工程的時候可能不到一秒,大的工程一般也在5秒鍾這內編譯完成了。
D. 如何在xcode中進行依賴性編譯
當你確定了項目的依賴性之後,各個項目就會按照設定的依賴關系確定編譯順序,從而順利的編譯整個工程。 1、把子項目,例如dylib項目,添加到應用程序項目中來。在應用程序的項目中,Ctrl+點擊Groups & Files中的項目名稱,在磁碟中選中xcodeproj文件,然後好,就可以把這個項目作為參考添加到當前項目中了。 2、雙擊項目的Targets,在彈出窗口的General頁的左下角,點擊+,在彈出窗口中選中參考項目的對應Targets,然後點擊Add Targets。 關閉窗口後,你在應用程序項目中編譯時,就會先編譯依賴的項目,然後才會編譯應用程序項目了。
E. 如何加快xcode編譯速度
1. 增加XCode執行的線程數
可以根據自己Mac的性能,更改線程數設置5:defaults write com.apple.Xcode 5
另外也有一個設置可以開啟:defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
XCode默認使用與CPU核數相同的線程來進行編譯,但由於編譯過程中的IO操作往往比CPU運算要多,因此適當的提升線程數可以在一定程度上加快編譯速度。
2.將Debug Information Format改為DWARF
在工程對應Target的Build Settings中,找到Debug Information Format這一項,將Debug時的DWARF with dSYM file改為DWARF。
這一項設置的是是否將調試信息加入到可執行文件中,改為DWARF後,如果程序崩潰,將無法輸出崩潰位置對應的函數堆棧,但由於Debug模式下可以在XCode中查看調試信息,所以改為DWARF影響並不大。這一項更改完之後,可以大幅提升編譯速度。
比如在目前本人負責的項目中,由於依賴了多個Target,所以需要在每個Target的Debug Information Format設置為DWARF。順便提一下,如果通過Cocoapod引入第三方則Debug Information Format默認就是設置為DWARF的。
SDWebImage通過Cocoapod``Debug Information Format的默認設置
注意:將Debug Information Format改為DWARF之後,會導致在Debug窗口無法查看相關類類型的成員變數的值。當需要查看這些值時,可以將Debug Information Format改回DWARF with dSYM file,clean(必須)之後重新編譯即可。
3.將Build Active Architecture Only改為Yes
在工程對應Target的Build Settings中,找到Build Active Architecture Only這一項,將Debug時的NO改為Yes。
664334-fa1eb995c140ce0f.png
這一項設置的是是否僅編譯當前架構的版本,如果為NO,會編譯所有架構的版本。需要注意的是,此選項在Release模式下必須為NO`,否則發布的ipa在部分設備上將不能運行。這一項更改完之後,可以顯著提高編譯速度。
4.設計編譯優化等級
不要再項目中或者靜態庫中使用-O4,因為這會讓Clang鏈接Link Time Optimizations (LTO)使得編譯更慢,通常使用-O3。
注意:在設置編譯優化之後,XCode斷點和調試信息會不正常,所以一般靜態庫或者其他Target這樣設置。
4.資源整合
4.1 將常用的代碼及文件打包成靜態庫
4.2 添加預編譯文件,把常用的頭文件放到預編譯文件裡面
4.3 能用@class就用@class
F. 增加xcode編譯類型distribution屬性
你新建的是什麼類型的工程啊?應該選擇mac os X的工程,選擇command tool 的那個選項,在type中選擇c,就可以編寫c程序,並且運行了。 希望能幫助到你。
G. 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有):
int a[ 2 ][ 2 ] = { 0, 1, 2, 3 };
int b[ 2 ][ 2 ] = { { 0, 1 }, { 2, 3 } };
不匹配的返回類型
GCC_WARN_ABOUT_RETURN_TYPE = YES 缺少括弧GCC_WARN_MISSING_PARENTHESES = YES例子:
{
if( a )
if( b )
foo();
else
bar();
}
{
if( a )
{
if( b )
foo();
else
bar();
}
}
在結構體初始化時缺少欄位
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: 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 :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:];
H. 如何用腳本 更改xcode編譯選項
iphonesdk從2.2開始就不能很方便的加入預處理宏了2.2之後的方法是在GCC編譯選項組下面,手工添加一個欄位GCC_PREPROCESSOR_DEFINITIONS,然後對應的value填上你的預處理define即可
I. 如何在XCode里添加DEBUG宏定義
iphone sdk從2.2開始就不能很方便的加入預處理宏了
2.2之後的方法是在GCC編譯選項組下面,手工添加一個欄位GCC_PREPROCESSOR_DEFINITIONS,然後對應的value填上你的預處理define即可
J. xcode如何編譯python
1、找到Python位置:
終端輸入:which python
獲取python的安裝位置,一般為/usr/bin/python。獲取到這個路徑方便使用它來搭建python的編譯環境。
2、在Xcode中創建python程序
打開Xcode,新建工程(Shift+Command+N),選擇Cross-platform->Ohter->External Build System,繼續下一步。
在Build Tool中粘貼剛剛找到的python路徑,eg:/usr/bin/python,點擊Next:
相關推薦:《Python基礎教程》
3、設置Edit Scheme
創建好項目之後,在左上角的項目圖表上點擊一下,選擇Edit Scheme
第一個選項Info中的Executable選擇python的路徑,eg:/usr/bin/python
第二個選項Arguments里,在第一個Arguments passed on launch里,新建一個你即將新建的.py文件,eg:main.py
第三個選項Option里,勾選Working Directory並選擇到Xcode Project所在的文件夾,也就是你的.py文件存放的文件夾,最後選擇確定。
4、Build and Run
在項目中新建文件(Command+N),選擇macOS->Other->Empty,命名為剛剛在Scheme里添加的文件名,eg:mian.py
現在編寫代碼,並點擊Run, 就可以實現python程序在Xcode下的編譯和運行了。