<一>html
參考: http://blog.csdn.net/mad1989/article/details/40658033程序員
1,Debug和Release版本區別?網絡
衆所周知,咱們進行iOS開發,在Xcode調試程序時,分爲兩種方式,Debug和Release,在Target的Setting中相信你們應該看到不少選項都分爲Debug和Release,方便咱們分別設置,知足調試和發佈的不一樣需求。app
Release是發行版本,比Debug版本有一些優化,文件比Debug文件小 Debug是調試版本,Debug和Release調用兩個不一樣的底層庫。通俗點講,咱們開發者本身內部真機或模擬器調試時,使用Debug模式就好,等到想要發佈時,也就是說須要大衆客戶使用時,須要build Release版本,具體區別以下:函數
1、Debug是調試版本,包括的程序信息更多
2、只有Debug版的程序才能設置斷點、單步執行、使用TRACE/ASSERT等調試輸出語句
3、Release不包含任何調試信息,因此體積小、運行速度快工具
那麼,問題來了,咱們調試程序時,該如何生成(Build)或運行Debug或是Release版本呢?佈局
Xcode左上角,點中項目名稱-Edit Scheme,或是菜單欄-Product-Scheme-Edit Scheme 彈出界面以下:性能
當你這裏設置Debug時,你build/Run後就是debug版本,相應的,修改爲Release模式,出來的就是release版本,這裏能夠很方便切換。學習
2,Archive(歸檔)的做用?測試
剛開發時,始終不知道這個的做用,只知道要打包生成APP時,須要用這個,那麼到底Archive和Release有什麼關係呢?
archive是你要上傳包的時候,打包。也就是說Archive只跟APP要上傳到appStore的時候有關,通常狀況下,只有在那個時候纔會用Archive,能夠這麼理解。因此Archive也分爲Debug和Release兩個,你能夠Archive出一個Debug版本的應用也能夠Archive出一個Release的應用。
因此說,Archive和Release沒有太大的關係,Archive咱們平時通常都不會用到的。
3,Profile
點擊運行Profile,profile 以後,會有一個工具選項. 而後你能夠查看app 性能
4,Analyze
analyze,是查找靜態內存泄漏,之前mrc 的時候會用。Profile和Analyze均可以在Scheme中設置:
總結:
默認run,是debug模式,就是真機聯調.
若是你修改成release,是run 的時候, 爲發佈模式.
直接archive 是系統提供幫助打包的,Archive生成後的文件會小不少~
iOS生成靜態庫方法-iOS集成靜態庫-iOS合併靜態庫_ 參考:
http://blog.sina.com.cn/s/blog_7b9d64af0101jlym.html
<二>
參考: http://www.jianshu.com/p/9c4c92a38468
對於軟件開發而言,調試是必須學會的技能,重要性不言而喻。對於調試的技能,基本上是能夠遷移的,也就是說你之前在其餘平臺上掌握的不少調試技巧,不少也是能夠用在iOS開發中。不一樣語言、不一樣IDE、不一樣平臺的調試,有同性也有個性。今天咱們就來學習一下iOS開發中的調試技巧,語言暫用爲OC,IDE固然是強大的Xcode。首先說明下,Xcode已經爲咱們調試項目提供了極大的方便。
【1.普通斷點】
斷點(Breakpoint)絕對是調試程序的第一大選擇,也是掌握的基礎技能。顧名思義,當程序運行到斷點處時會暫停運行。好比斷點打在11行,那麼程序就會停在11行(注意:程序只運行到了前10行,第11行其實尚未被執行!!!)。只要在代碼行旁邊點擊,就能添加一個斷點,再次點擊,就能讓斷點不可用(disable了,仍然存在,只是不起做用了)。在某一行建立斷點的快捷鍵是:command+\
並能在調試過程當中在下方看到參數的值:
【2.條件斷點】
以上的斷點只是最普通的,咱們還能對斷點的屬性進行配置,設置條件,使斷點更加智能化,右鍵斷點進入編輯對話框:
我以一個循環做爲測試代碼:
循環中的代碼每次都要單步執行,可能這並非我想要的。我想要在i爲3的時候中斷程序,進行調試,編寫條件以下:
設置i==3的條件後,程序就會在該條件時中斷,而不會每次到達該位置都中斷。中斷時輸出以下:
同時也能夠設置Ignore參數,會忽略前面n次的斷點運行,會在第n+1次中斷。
調試輸出以下:
同時,還能夠查看某個函數被調用的次數,設置Action參數以下,注意要選中Automatically continue after evaluating actions.
輸出結果以下:
【3.異常斷點】
斷點的功能不限於上面所述。開發iOS知道,若是咱們由於異常而後程序crash了,代碼就直接跑到main.m的main函數中去了。爲何就不能跑到出現異常的代碼中呢???異常斷點就爲咱們解決該問題,程序就會在異常出現的那行代碼終止。建立異常斷點圖例以下:
以下所示就建立完成了。若是碰到異常crash時,嘗試使用異常斷點吧。
【4.符號斷點Symbolic Breakpoint】
符號斷點的建立也同異常斷點。通常符號斷點能夠在你指定的[類名 方法名]時中斷執行。
配置符號斷點以下:能夠當執行到ViewController類的viewDidLoad方法時中斷執行。
若是你的Symbol只寫了一個函數名,那麼就會在出現該函數名的地方就中斷執行。以下,就會在運行到doAnimation的時候中斷。是否是很強大呢?
【5.Analyze分析器】
Analyze分析器是一種靜態的工具,能夠對咱們的程序進行分析,找出咱們未使用的變量,或一些死存儲。執行Analyze以下:Product-->Analyze. 以下藍色的標記就是靜態分析的結果。
固然,咱們能夠設置在編譯程序的時候同時Analyze,把下列選項設爲Yes便可。
【6.Profile檢查器】
這個工具實在是太NB了,三言兩語說不完,貼張圖,你們感覺一下。一樣在Product-->Profile中打開。
【7.殭屍對象】
iOS中把那些已經release但還沒徹底消失的對象叫作殭屍對象,對已經release的對象再次釋放,就會發生異常。雖然自從使用ARC後,因爲對象釋放產生的異常已經大大變少,但偶爾還會出現。開啓殭屍對象模式後,就能快速定位到異常位置。開啓方式以下:Product-->Scheme-->Edit Scheme. 勾選Enable Zombie Objects便可。
【8.lldb命令】
Xcode中使用llvm編譯器,公認爲最好的C、C++、OC、Swift編譯器。而lldb是llvm中的調試器,咱們可使用一些簡單的命令進行調試,我仍是把上面的循環代碼做爲測試代碼。
斷點調試中,使用po命令、print命令在Console控制檯打印出變量信息:
【9.NSLog打印】
應該說NSLog打印信息是初學者最喜歡的調試手法,也是最簡單的調試,經過打印出的信息查看程序運行的路徑。可是打印出的信息較少,自己NSLog效率較低,有人使用宏作了部分優化,代碼以下:可以打印出所在類名、所在方法名、詳細時間、行號。
#import "ViewController.h"
#define NSLog(format, ...) do { \
fprintf(stderr, " %s\n", \
[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], \
__LINE__, __func__); \
(NSLog)((format), ##__VA_ARGS__); \
fprintf(stderr, "-------\n"); \
} while (0)
@interface ViewController ()
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
for (int i = 0; i < 5; i++) {
NSLog(@"個人值:%d",i);
}
}
打印結果以下:
【10.生命週期方法init,dealloc】
對於ViewController來講,有兩個生命週期函數咱們能夠進行重寫,也就是init和dealloc方法。對於某些對象的狀態,咱們能夠在這兩個方法中查看。尤爲是在dealloc中能夠看到當ViewController退出的時候某個對象是否release。
- (instancetype)init
{
self = [super init];
if (self) {
//初始化語句;
}
return self;
}
- (void)dealloc
{
//釋放後調用;
}
【11.查看代碼運行時間】
有時候咱們想要準確的知道某段代碼、某個循環執行的時間,而後分析效率等問題,這個時候就須要執行時間是多少。正好看到網上已經有人作了這個工做,我就直接摘下來了。正好也用了宏的方式計算時間,咱們只要在須要計算時間的代碼塊先後寫上TICK,TOCK宏便可。固然,原理也是很是的簡單,也就是使用NSDate計算差值。
#import "ViewController.h"
#define TICK NSDate *startTime = [NSDate date]
#define TOCK NSLog(@"Time: %f", -[startTime timeIntervalSinceNow])
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
TICK;
for (int i = 0; i < 5; i++) {
NSLog(@"個人值:%d",i);
}
TOCK;
}
@end
打印結果以下:
【12.手機截屏】
手機截屏也算調試?哈哈。其實也算是開發中的一個小技巧哈。其實你們都會在iPhone上同時按電源鍵+Home鍵截屏,而後使用各類通信軟件發給其餘人,這個略顯不方便。咱們來使用Xcode中的方式截屏。當手機接上電腦後,注意要把調試設備選爲本身的手機:
而後選擇Debug-->View Debugging-->Take Screenshot... .而後能夠看到手機屏幕已經在你的電腦桌面了。是否是比直接在手機上操做方便多了呢?這樣就能夠快速的發給其餘開發者、PM等人了。
【13.viewDidLoad不建議寫太多代碼】
我的建議不要在viewDidLoad方法中寫入太多代碼。尤爲是涉及該界面中的動畫的時候,由於執行viewDidLoad方法的時候,界面可能還沒徹底加載出來,若是此時把動畫放在viewDidLoad中,可能會形成動畫沒法顯示。固然也不建議把耗時的網絡請求和動畫效果都放在viewDidLoad中,界面的阻塞也會形成動畫沒法顯示。能夠嘗試把動畫放在viewDidAppear,viewWillAppear方法中。對於這類涉及UI的問題,調試也是比較麻煩的。。。
【14.視圖調試】
現在iOS開發的UI設計有不少種方式,好比storyboard,xib,代碼實現。對於stoayboard,xib可視化實現是比較簡單的,可是對於一些「iOS老程序員」而言,都喜歡使用代碼實現UI,而且可能UI層次還比較複雜。這樣就給咱們新接手項目的開發者帶來不少困擾。如何快速查看一個複雜UI的界面層次和佈局,最快的方法就是用到視圖調試。
當項目運行到某一個界面(能夠是模擬器或真機)時,開啓視圖調試,點擊按鈕如圖:
這樣就會進入試圖調試,你能夠很方便的查看這個界面。這裏能夠看到控件之間的層次關係。
左側的樹形層次圖能夠在查看線程、隊列和UI之間切換:
【15】經常使用的編譯宏定義:可讓代碼在不一樣的編譯狀況下執行。
(1)__OPTIMIZE__ :用於release和debug的判斷,當選擇了__OPTIMIZE__ 時,可讓代碼在release時執行,在debug時不執行。示例以下:
#ifndef __OPTIMIZE__
//這裏執行的是debug模式下
else
//這裏執行的是release模式下
#endif
(2)__i386__ 與 __x86_64__ :用於模擬器環境和真機環境的判斷。知足該條件的代碼只在模擬器下執行。示例代碼以下:
#if defined (__i386__) || defined (__x86_64__)
//模擬器下執行
#else
//真機下執行
#endif
(3)__IPHONE_OS_VERSION_MAX_ALLOWED :當前編譯的SDK版本,能夠與__IPHONE_9_0等宏定義進行比較,進行不一樣版本下代碼的執行。示例以下:
if (__IPHONE_OS_VERSION_MAX_ALLOWED == __IPHONE_9_0) {
//若是當前SDK版本爲9.0是執行這裏的代碼
}else{
//不然執行這裏
}
【16】預編譯宏 #ifdef #else #endif
#ifdef ****
//代碼1
else
//代碼2
#endif
意思是 若是標識符****已被#define命令定義過,則對代碼1進行編譯,不然對代碼2進行編譯。
同時也有#ifndef,則與#ifdef恰好相反。
做者:(乞力馬...) 原文 http://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=404478233&idx=2&sn=ae55d4f70fce47c11958f0b8536f4370&scene=23&srcid=0322WVWcizsblwnzfHYWq13O#rd