標籤:
建立 Object-C 程式
進入主介面方式 : 開啟 Xcode 之後, 可以使用 Xcode 菜單, 但是必須建立一個 Object-C 工程 或者 匯入 一個 Object-C 工程才可以進入主介面;
-- 開啟現有工程 : 點擊右邊的記錄, 就可以開啟現有的工程;
-- 建立工程 : 點擊第一個 Create a new Xcode Project 即可建立一個新工程;
-- 匯入工程 : 點擊 Check out an existing project 可以匯入一個已經建立的工程;
建立一個命令列程式 : 選擇 建立工程介面的 OS X --> Command Line Tool 程式, 即建立了一個命令列程式, Cocoa Application 是建立有介面的程式;
-- ios 項目 : ios項目是為手機和平板開發的應用;
-- OS X 項目 : OS X 是為 OS 作業系統建立的應用;
建立工程 : 註明 工程名, 公司名稱, 類型;
-- Product Name : 工程名稱;
-- Organization Name : 組織名稱;
-- Type : 這裡選 Foundation, 這是 Object-C 工程;
建立 IOS 項目
開啟 Xcode 並選擇建立新工程 : 快顯功能表中選擇 IOS --> Single View Application 工程;
填寫項目資訊 :
-- Product Name : 項目名稱;
-- Organization Name : 公司標識;
-- Class Prefix : 為了避免使用者定義類與 Object-C 類命名衝突問題, 在每個類之前都加上這個首碼;
-- Devices : 選擇應用啟動並執行裝置, Universal 表示同事相容 ipad 和 iphone;
Xcode 介面詳解
1. Xcode 介面簡介
(1) 頂部地區
程式運行相關 :
-- 從左至右介紹 : 運行按鈕, 停止按鈕, 為工程選擇運行平台;
編輯器相關 :
-- 從左至右介紹 : 標準編輯器, 輔助編輯器, 版本編輯器;
面板控制相關 :
-- 從左至右介紹 : 隱藏左側面板, 隱藏底部面板, 隱藏右側面板;
(2) 左面板
面板介紹 : 該面板是 Xcode 工程導航面板, 上方的七個按鈕用於切換導航模式;
(3) 底部面板
面板介紹 : 用於 Xcode 顯示 控制台調試輸出資訊;
(4) 右面板
檢查器面板 : 根據項目的不同, 包含大量審查器;
庫面板 :
-- 庫面板簡介(從左至右) : 檔案模板庫, 程式碼片段庫, 物件程式庫, 媒體庫;
(5) 詳細編輯區
該地區是代碼編寫主要區域 :
2. 導航面板詳解
導航面板簡介 :
-- 從左至右 : 項目導航, 符號導航, 搜尋導航, 問題導航, 測試導航, 調試導航, 斷點導航, 日誌導航;
(1) 項目導航
項目導航組成 :
-- 源檔案 : 在 HelloWorld 目錄下的 ".h" 和 ".m" 尾碼檔案是源檔案;
-- 屬性檔案 : 在 HelloWorld 下的 Supporting Files 目錄下是屬性檔案 圖片等;
-- 單元測試項目 : HelloWorldTest 是工程的單元測試項目;
-- 目標應用 : Products 目錄下的 HelloWorld.app 是目標應用;
(2) 符號導航
符號導航簡介 : 用符號顯示工程中的 類, 項目 和 屬性;
-- 表示方式 : C 表示類, M 表示方法, P 表示屬性;
-- 快速定位 : 點擊對應的方法或者屬性, 能快速定位到這個類中;
(3) 搜尋導航
搜尋導航簡介 : 在搜尋方塊中輸入要搜尋的字串, 按斷行符號就可以搜尋出包含該字串的類;
(4) 問題導航面板
問題導航面板簡介 : 顯示項目中存在的警告或者錯誤;
(5) 測試導航
測試導航簡介 : 點擊 testExample 後面的執行按鈕, 就會運行該單元測試;
(6) 調試導航
調試導航簡介 : 調試導航面板中顯示了各線程的詳細資料;
添加斷點 : 在 OCTViewController.m 中添加一個斷點;
開始調試(自動判斷) : 點擊頂部面板中的調試按鈕, 如果代碼中有斷點, 就會自動進入調試狀態, 執行到斷點時會自動停止, 詳細調試資訊顯示在底部的調試輸出面板;
調試面板介紹 : 下面從左至右介紹;
-- Continue program execution : 繼續執行下面的代碼;
-- Step over : 單步調試, 點擊一次該按鈕, 執行一行代碼, 如果有方法調用, 不會進入方法中;
-- Strp in : 步入調試, 點擊該按鈕, 會進入方法中;
-- Step out : 步出調試, 在方法中, 點擊該按鈕, 會退出方法, 執行方法外的單步調試;
(7) 斷點導航
斷點導航簡介 : 列出所有的斷點, 方便管理斷點;
(8) 日誌導航
日誌導航簡介 : 列出項目開發過程中 構建, 產生, 運行過程, 每次該過程都可以通過日誌面板查看;
3. 檢查器面板
檢查面板分類 :
-- 普通源檔案 : 包含 檔案檢查器 和 快速協助器;
-- 故事版 : 介面檔案, 除了檔案檢查器 和 快速協助器之外, 還有 身份檢查器, 屬性偵測器, 大小檢查器, 串連檢查器;
檔案檢查器 :
-- Identity and Type : File Name(檔案名稱), File Type(檔案類型), Full Path(路徑);
-- Text Settings : Text Encoding(檔案編碼使用字元集), Indent Using(縮排), Wrap lines(自動換行);
快速協助器 : 將游標停留在系統類別的時候, 該面板會顯示該類的 參考手冊, 使用指南 和 範例程式碼;
介面設計相關檢查器 : 使用者選中 ".storyboard" 或者 ".xib" 尾碼的檔案時, 會多出另外四個檢查器;
-- 身份檢查器 : 管理介面組件類 實作類別, 恢複ID 等標識性的屬性;
-- 屬性偵測器 : 管理介面組件 展開方式, 背景色 等屬性;
-- 大小檢查器 : 管理介面組件 寬高 xy軸座標 等屬性;
-- 串連檢查器 : 管理介面組件 與程式碼之間的關聯性;
4. 庫面板
庫面板簡介 : 從左至右介紹;
-- 檔案庫模板 : 管理檔案模板, 可以快速建立指定類型檔案, 可以直接拖入項目中;
-- 程式碼片段庫 : 管理各種程式碼片段, 可以直接拖入原始碼中;
-- 物件程式庫 : 介面組件, 可以直接拖入 故事板中;
-- 媒體庫 : 管理各種 圖片, 音頻 等多媒體資源;
Xcode 協助系統詳解
協助系統作用 : Object-C 開發中需要調用很多系統的類, 需要瞭解每個類的 用法, 通過 Xcode 協助系統可以查詢這些類的用法;
1. 快速協助面板
右面板中的快速面板顯示內容 : 該類繼承的父類, 遵循的協議, 類所在架構, 點擊Reference 中的連結, 可以進入類的詳細介紹;
類詳細介紹頁面 : 通過 快速協助面板 中的 Reference 中的連結, 可以進入該頁面;
類方法分類介面 : 該介面與詳細介紹介面是同一個, 下拉即可;
2. 直接搜尋
搜尋 : 通過任意連結進入類詳細介紹介面之後, 可以在上方的輸入框中輸入關鍵字, 即可搜尋相關的 類, 方法, 協議 或者 函數;
3. 代碼自動提示
提示方式 : 代碼編輯地區, 按住 option 鍵, 然後將游標移動到類上, 會變成問號, 點擊就會出現下面的提示框;
1. 副檔名介紹
C語言源檔案尾碼 : ".c";
C++語言源檔案尾碼 : ".cc", ".cpp";
標頭檔 : ".h";
Object-C來源程式 : ".m";
Object-C++來源程式 : ".mm";
C/C++/Object-C/Object-C++產生的中間檔案 : ".o";
C/C++/Object-C/Object-C++產生的可執行檔 : ".out";
2. 程式源碼及解析
程式源碼 :
/* 匯入 Foundation 架構下的 Foundation.h 檔案 */#include <Foundation/Foundation.h>/* 程式入口函數 */int main(int argc, char * argv[]){/* 自動釋放池, 該環境中執行的語句會自動回收所建立的對象 */@autoreleasepool{/* Foundation 中的輸出函數, 可輸出字串, 對象等 */NSLog(@"Hello World"); /* @"Hello World", 加上 @ 是為了與 C 中的字串區分 */}return 0;}
(1) 匯入架構標頭檔
匯入標頭檔語句 : #import <a/b.h> 是匯入 a 架構 中的 b.h 標頭檔;
架構簡介 : 架構是 一系列類 函數的集合, Cocoa QuickTime 都被封裝成了架構, Cocoa 包括了 Foundation 和 Application Kit 等組件;
(2) 自動釋放池
記憶體管理 : 在早期的 Object-C 需要手動管理記憶體的分配和回收, Object-C 2.0 引入了 ARC(自動引用計數) 和 自動釋放池, 不在進行手動記憶體管理;
自動釋放池 : 使用 "@autoreleasepool{}" 包裹的代碼位於 Object-C 的自動釋放池中, 這些語句會自動回收建立的對象, 不用進行手動的記憶體管理;
(3) 字串輸出
NSLog()函數 : 該函數是 Foundation 架構提供的一個函數, 該函數可以輸出 字串 對象等;
-- NS 首碼說明 : Cocoa 架構中所有的 類 函數 常量 都會加上 NS 首碼;
-- @"string" 說明 : @符號 用於區分 Object-C 與 C語言字串, 加上 @ 符號的時 Object-C 字串;
3. 編譯運行代碼
LLVM Clang 編譯器文法 : clang -fobjc-arc -framwork 架構名稱 來源程式 -o 輸出結果 ;
-- -fobjc-arc 參數 : 啟用 Object-C 的 ARC 自動技術功能;
-- -o 參數 : 如果不帶, 預設 輸出 a.out ;
編譯執行結果 :
octopus-2:ios octopus$ clang -fobjc-arc -framework Foundation 01-HelloWorld.m octopus-2:ios octopus$ ls01-HelloWorld.ma.outoctopus-2:ios octopus$ ./a.out 2014-08-10 00:22:55.670 a.out[3394:507] Hello World
LLDB(就是Xcode下方的調試欄)中有用的一些命令
列印協助
列印調用棧
列印最基本的內容 (p)
列印對象(po)
列印運算式(expr)
列印線程中的一些東西
LLDB 常用命令
假如你準備在模擬器裡面運行這個,你可以在“(lldb)”提示的後面輸入下面的:
(lldb) po $eax
LLDB在xcode4.3或者之後的版本裡面是預設的調試器。假如你正在使用老一點版本的xcode的話,你又GDB調試器。他們有一些基本的相同的命令,因此假如你的xcode使用的是“(gdb)”提示,而不是“(lldb)”提示的話,你也能夠更隨一起做,而沒有問題。
“po”命令是“print object”(列印對象)的簡寫。“$eax”是cup的一個寄存器。在一個異常的情況下,這個寄存器將會包含一個異常對象的指標。注意:$eax只會在模擬器裡面工作,假如你在裝置上調試,你將需要使用”$r0″寄存器。
例如,假如你輸入:
(lldb) po [$eax class]
你將會看像這樣的東西:
(id) $2 = 0x01446e84 NSException
這些數字不重要,但是很明顯的是你正在處理的NSException對象在這裡。
你可以對這個對象調用任何方法。例如:
(lldb) po [$eax name]
這個將會輸出這個異常的名字,在這裡是NSInvalidArgumentException,並且:
(lldb) po [$eax reason]
這個將會輸出錯誤訊息:
(unsigned int) $4 = 114784400 Receiver () has no segue with identifier ‘ModalSegue‘
注意:當你僅僅使用了“po $eax”,這個命令將會對這個對象調用“description”方法和列印出來,在這個情況下,你也會得到錯誤的訊息。
實用LLDB命令
命令名 用法 說明
| |
| expr |
expr 運算式 |
可以在調試時動態執行指定運算式,並將結果列印出來,很有用的命令。 |
| po |
po 運算式 |
與expr類似,列印對象,會調用對象description方法。是print-object的簡寫 |
| print |
print (type) 運算式 |
也是列印命令,需要指定類型。 |
| bt |
bt [all] |
列印呼叫堆疊,是thread backtrace的簡寫,加all可列印所有thread的堆棧。 |
| br l |
br l |
是breakpoint list的簡寫 |
| process continue l |
process continue |
簡寫:c |
| thread step-in l |
thread step-in l |
簡寫:s |
| thread step-inst l |
thread step-inst l |
簡寫:si |
| thread step-over l |
thread step-over l |
簡寫:n |
| thread step-over-inst l |
thread step-over-inst l |
簡寫:ni |
| thread step-out l |
thread step-out l |
簡寫:f |
| thread list |
thread list |
簡寫:th l |
記憶體流失隱患提示:
Potential Leak of an object allocated on line ……
資料賦值隱患提示:
The left operand of …… is a garbage value;
對象引用隱患提示:
Reference-Counted object is used after it is released;
對retain、copy、init、release、autorelease等在計數時的使用方式的詳細講解,推薦一下:
http://www.cnblogs.com/andyque/archive/2011/08/08/2131236.html
調用autorelease這意味著,你可以在這個函數裡面使用vari,但是,一旦下一次run loop被調用的時候,它就會被發送release對象。然後引用計數改為0,那麼記憶體也就被釋放掉了。(關於autorelease到底是怎麼工作的,我的理解是:每一個線程都有一個autoreleasePool的棧,裡面放了很多autoreleasePool對象。當你向一個對象發送autorelease訊息之後,就會把該對象加到當前棧頂的autoreleasePool中去。噹噹前runLoop結束的時候,就會把這個pool銷毀,同時對它裡面的所有的autorelease對象發送release訊息。而autoreleasePool是在當前runLoop開始的時候建立的,並壓入棧頂。那麼什麼是一個runLoop呢?一個UI事件,Timer call, delegate call, 都會是一個新的Runloop。)
Xcode介面簡介